* 예전에 연령과 성별을 찾기위해 작성한 프로그램입니다.
오래되어서 프로그램이 많이 복잡하네요..^^
함수나 로직 변경으로 간단히 사용하시기를 바랍니다.
9.3에는 연령구하는 함수가 생겼습니다. - YRDIF Function
* 나이계산예제
* http://support.sas.com/kb/24/808.html;
* http://support.sas.com/kb/24/567.html
* (V.3) YRDIF Function : http://support.sas.com/documentation/cdl/en/lefunctionsref/63354/HTML/default/viewer.htm#p1pmmr2dtec...;
/***************************************************************************************/
* 고객정의;
* 성별(7번째);
* 1800년대생 : 남자 9, 여자 0;
* 1900년대생 : 남자 1, 여자 2;
* 2000년대생 : 남자 3, 여자 4;
* 외국인;
* 1900년대생 : 남자 5, 여자 6;
* 2000년대생 : 남자 7, 여자 8;
/***************************************************************************************/
%LET INPUT_DATE='20110106';
data BACK;
INPUT INDIV_CO_NO $13.;
CARDS;
8801011111111
;
RUN;
DATA BACK1;
SET BACK;
* 고객구분 ( 1:개인, 2:법인, 0:기타(주민번호오류) ) ;
IF (LENGTH(INDIV_CO_NO)) = 13 THEN DO;
IF PRXMATCH("/\d\d\d\d\d\d\d\d\d\d\d\d\d/",INDIV_CO_NO) < 1 THEN CUST_GBN = '0';
* 2020년 이후;
ELSE IF SUBSTR(INDIV_CO_NO,7,1) IN ('3','4','7','8')
AND SUBSTR(INDIV_CO_NO,1,1) IN ('2','3','4','5','6','7','8','9') THEN CUST_GBN = '0';
* 1880년대 이전;
ELSE IF SUBSTR(INDIV_CO_NO,7,1) IN ('9','0')
AND SUBSTR(INDIV_CO_NO,1,1) IN ('1','2','3','4','5','6','7','8') THEN CUST_GBN = '0';
* 월요류;
ELSE IF SUBSTR(INDIV_CO_NO,3,2) = '00' THEN CUST_GBN = '0';
ELSE IF SUBSTR(INDIV_CO_NO,3,2) >= '13' THEN CUST_GBN = '0';
* 일오류;
ELSE IF SUBSTR(INDIV_CO_NO,5,2) = '00' THEN CUST_GBN = '0';
ELSE IF SUBSTR(INDIV_CO_NO,3,2) IN ('01','03','05','07','08','10','12')
AND SUBSTR(INDIV_CO_NO,5,2) >= '32' THEN CUST_GBN = '0';
ELSE IF SUBSTR(INDIV_CO_NO,3,2) IN ('04','06','09','11')
AND SUBSTR(INDIV_CO_NO,5,2) >= '31' THEN CUST_GBN = '0';
ELSE IF SUBSTR(INDIV_CO_NO,3,2) = '02'
AND SUBSTR(INDIV_CO_NO,5,2) >= '30' THEN CUST_GBN = '0';
ELSE CUST_GBN = '1';
END;
* 법인오류;
ELSE IF (LENGTH(INDIV_CO_NO)) = 10 AND PRXMATCH("/\d\d\d\d\d\d\d\d\d\d/",INDIV_CO_NO) < 1 THEN CUST_GBN = '0'; * 10자리 숫자 체크;
ELSE IF (LENGTH(INDIV_CO_NO)) = 10 THEN CUST_GBN = '2';
ELSE CUST_GBN = '0';
* 만연령;
IF CUST_GBN = '1' THEN DO;
IF SUBSTR(INDIV_CO_NO,7,1) IN ('1','2','5','6') THEN PIB_YY1 = '19';
ELSE IF SUBSTR(INDIV_CO_NO,7,1) IN ('3','4','7','8') THEN PIB_YY1 = '20';
ELSE IF SUBSTR(INDIV_CO_NO,7,1) IN ('9','0') THEN PIB_YY1 = '18';
* 윤년에 따른 2월 29일 존재 체크;
* 윤년이면서 2월생 중 일자가 30일 이상인 경우;
IF SUBSTR(INDIV_CO_NO,3,2) = '02' AND
( ( MOD(PIB_YY1||SUBSTR(INDIV_CO_NO,1,2),4) = 0 AND
MOD(PIB_YY1||SUBSTR(INDIV_CO_NO,1,2),100) NE 0 ) OR
MOD(PIB_YY1||SUBSTR(INDIV_CO_NO,1,2),400)= 0
) AND
SUBSTR(INDIV_CO_NO,5,2) >= '30' THEN CUST_GBN = '0';
/*ELSE IF SUBSTR(INDIV_CO_NO,3,2) = '02' AND SUBSTR(INDIV_CO_NO,5,2) >= '29' THEN CUST_GBN = '0';*/
* 윤년이 아니면서 2월생 중 일자가 29일 이상인 경우;
ELSE IF SUBSTR(INDIV_CO_NO,3,2) = '02' AND
(( MOD(PIB_YY1||SUBSTR(INDIV_CO_NO,1,2),4) NE 0 OR
MOD(PIB_YY1||SUBSTR(INDIV_CO_NO,1,2),100) = 0 ) AND
MOD(PIB_YY1||SUBSTR(INDIV_CO_NO,1,2),400) NE 0
) AND
SUBSTR(INDIV_CO_NO,5,2) >= '29' THEN CUST_GBN = '0';
ELSE DO;
* 주민번호 년월일 생성;
PIB_YMD = INPUT(TRIM(PIB_YY1||SUBSTR(INDIV_CO_NO,1,6)), YYMMDD10.);
MON_YMD2 = MDY(SUBSTR(&INPUT_DATE,5,2),SUBSTR(&INPUT_DATE,7,2),YEAR(PIB_YMD));
IF PIB_YMD >= MON_YMD2 THEN CUST_AGE = INTCK('YEAR',PIB_YMD,INPUT(&INPUT_DATE,YYMMDD10.))-1; * 년령계산;
ELSE CUST_AGE = INTCK('YEAR',PIB_YMD,INPUT(&INPUT_DATE,YYMMDD10.));
IF CUST_AGE > 99 then CUST_AGE = 99;
END;
END;
* 피보험자 연령대;
IF CUST_AGE NE . THEN AGE_RA1 = PUT(FLOOR(CUST_AGE/10.0),$1.)||'0';
ELSE AGE_RA1 = '??';
* 성별(M:남자, F:여자);
IF CUST_GBN = '1' AND SUBSTR(INDIV_CO_NO,7,1) IN ('1','3','5','7','9') THEN CUST_SEX = 'M';
ELSE IF CUST_GBN = '1' AND SUBSTR(INDIV_CO_NO,7,1) IN ('0','2','4','6','8') THEN CUST_SEX = 'F';
DROP PIB_YY1 PIB_YMD MON_YMD2;
RUN;
* 참고 : http://www.kr.freebsd.org/ml/questions/2001/06/msg00214.shtml
* 윤년;
연도가 4의 배수이면서 100의 배수가 아닌 경우와 4와 100의 배수이면서 400의 배수일 때 윤년입니다.
예를 들어서 2000년은 4와 100의 배수 이면서 또 400의 배수이기 때문에 윤년이며 1900년은 4와 100의 배수이면서
400의 배수가 아니기 때문에 윤년이 아니라네요. ^^;
그리고 위에서 2003년은 윤년이 아니기에 2월을 28일로 세었습니다. 그런데 난이도 높은 문제는 윤년을 포함시켜 함정을 놓습니다.
태양력은 일년을 365일로 놓았지만 실제 1년은 365.2422일입니다. 실제로 이 오차가 수백년 쌓이면 심지어 1달까지도 날짜 오차가 일어날 수 있기
때문에 설정한 것이 윤년입니다.
먼저 해당연수가 4로 나누어 떨어지면 윤년, 그렇지 않으면 평년입니다. (1996년은 윤년이었죠)
그러나 해당연수가 100으로 나누어 떨어지면 평년입니다. (1900년은 평년입니다)
그러나 해당연수가 400으로 나누어 떨어지면 다시 윤년입니다.(2000년은 윤년이죠)
이렇게 계산하면 400년에 97년은 윤년이 됩니다.
if ( ( (mod(year, 4) = 0) and (mod(year,100) != 0) ) or mod(year,400)= 0)
)
total_days = 29;
else
total_days = 28;
Join us for SAS Innovate 2025, our biggest and most exciting global event of the year, in Orlando, FL, from May 6-9. Sign up by March 14 for just $795.