WITH t AS ( SELECT '7510131******' jno FROM dual UNION ALL SELECT '0909294******' FROM dual UNION ALL SELECT '9903049******' FROM dual ) SELECT jno 주민번호 , dt 생년월일 , FLOOR(MONTHS_BETWEEN(sysdate, TO_DATE(dt, 'yyyymmdd')) / 12) AS 만나이 FROM (SELECT jno , DECODE(SUBSTR(jno, 7, 1) , '1', '19', '2', '19' , '3', '20', '4', '20' , '9', '18', '0', '18' ) || SUBSTR(jno, 1, 6) dt FROM t ) ;
SELECT TO_CHAR(SYSDATE,'YYYY') - (SUBSTR(주민번호앞자리,1,2) + DECODE(SUBSTR((주민번호뒷자리,1,1)),'1','1900','2','1900','2000')) AS 나이 FROM DUAL WHERE TO_CHAR(SYSDATE,'YYYY') - (SUBSTR(주민번호앞자리,1,2) + DECODE(SUBSTR((주민번호뒷자리,1,1)),'1','1900','2','1900','2000')) BETWEEN 10 AND (30-1) ;
주민번호 뒷자리도 있어야 겠네요..
뒷자리 첫글자가 1이나 2이면 1900년대 사람이고 그렇지 않으면 2000년대 사람이겠네요..
그리고 우리나라 나이 기준으로 한다면 계산값에 1을 더해 줘서 계산해야 겠네요..