연령 구하기 질문(2000년생 이후 포함) 0 8 6,179

by 요루 [SQL Query] 연령 연령대 연령 구하기 2000년 1900년 [2010.01.05 11:01:58]


 

안녕하세요

주민번호 앞자리를 이용해서 연령을 구하려 하는데

2000년생 이후 출생자 때문에 고민이 되네요

일단 현재 쿼리는 

TO_CHAR(SYSDATE,'YYYY')-('19'||SUBSTR(IDNO,1,2))+1 AGE

입니다.

 

뒷자리의 첫번째가 3 OR 4 이면 '20'을 붙이고 1 OR 2이면 '19'를 붙이는

CASE WHEN 문을 써야할까요?

좀더 깔끔한 방법은 없을까요?

 

저 연령을 가지고 또 연령대를 나눠야해서 쿼리가 너무 길어질까 고민이되어서

도움 요청합니다.

by 빈이 [2010.01.05 11:13:29]
전 그냥 decode로 해봤어요 '')
with t as(
select '830101-110101' idno from dual
union all select '020101-310101' idno from dual
)
select TO_CHAR(SYSDATE,'YYYY')-
decode(substr(idno,8,1)
,3,('20'||SUBSTR(idno,1,2))
,4,('20'||SUBSTR(idno,1,2))
,('19'||SUBSTR(idno,1,2)) )+1 AGE
from t

by 마농 [2010.01.05 11:15:27]
case when 문을 쓰셔야 할듯 합니다.
다만 case 문도 완벽하다고 할 수 있을런지...
데이터의 유형이 좀더 다양할수 있는지 데이터를 확인해 보셔야 할듯 합니다.
9,0 - 1800년대생
1,2 - 1900년대생
3,4 - 2000년대생
5,6 - 외국인?
7,8 - 외국인?

by 빈이 [2010.01.05 11:18:52]
1800년생...최소 110살이다-_-;;

by 약탈 [2010.01.05 11:44:10]
쪼렙입니다...;

case when substr(주민뒷자리,1,1) in ('1','2','5','6') then
substr(to_char(sysdate,'yyyy'),3,2)+100 - substr(주민앞자리,1,2) else
substr(to_char(sysdate,'yyyy'),3,2) - substr(주민앞자리,1,2) end "나이"

이렇게 하면 될거같은데요?

by 요루 [2010.01.05 11:44:23]
ㅠ 어쩔수없군요. 두분 모두 감사합니다

by 꿈속에서 [2010.01.05 12:13:49]
만 나이 계산할때 쓰는건데.. 이거 사용하셔도될듯...

SELECT TRUNC(MONTHS_BETWEEN(SYSDATE,
TO_DATE(TO_CHAR(decode(substr('9901011234567',7,1),'1','19','2','19','4','20','5','19','6','19','7','20','8','20','9','18','0','18'))||substr('9901011234567',0,6),'YYYYMMDD'))/12) AS AGE
FROM DUAL;

by 요루 [2010.01.05 12:34:23]
아..만 나이도 생각 못했네요....
모두 감사드립니다

by v상이v [2010.01.07 09:17:02]
with t as(
select '810101-110101' idno from dual union all
select '830101-210101' idno from dual union all
select '010101-310101' idno from dual union all
select '020101-410101' idno from dual
)

select
TO_CHAR(SYSDATE,'YYYY') - (DECODE(SUBSTR(idno,8,1) ,1,'19',2,'19','20')||SUBSTR(idno,1,2)) + 1 AS AGE1 ,
TO_CHAR(SYSDATE,'YYYY') - (DECODE(TRUNC(SUBSTR(idno,8,1)/3,0),0,'19','20')||SUBSTR(idno,1,2)) + 1 AS AGE2 ,
TO_CHAR(SYSDATE,'YYYY') - (NVL2(DECODE(SUBSTR(idno,8,1),1,'Y',2,'Y'),'19','20')||SUBSTR(idno,1,2)) + 1 AS AGE3
from t

최대한 짧게 해달라고 하신거 같은데...DECODE문이 그나마....ㄷㄷ

마농님 말씀대로 다양한 데이터에선 결국 case문이 낳을듯 싶습니다...

정 길어지면...select문으로 다시 한번 감싸시면......ㄷㄷ
댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입