본문 바로가기

티끌팁

[query 파헤치기] SQL 만나이계산하기

반응형

나이계산하는 쿼리는 은근히 많이.사용한다. 나이계산하는 부분만 긁어서 파헤쳐 보겠다. 어렵게 사용하고 있지만, 하나씩 쪼개보면 별거 없다. 단지 목잡해 보일뿐... 

 

나이계산하는 부분만 가져왔다. SELECT나 WHERE절에 사용하면 유용하다.. 실제로 써 보면 알 것이다. 

 

[알아볼 부분]

WITH TEMP AS (

          SELECT '1901021000000' AS PNUM

             FROM DUAL

)

SELECT 

TRUNC( ( ( TO_CHAR(SYSDATE, 'yyyymmdd') - DECODE(SUBSTR(PNUM, 7,1),
'3','20' || SUBSTR(PNUM,1,6),
'4','20' || SUBSTR(PNUM,1,6),
'1','19' || SUBSTR(PNUM,1,6),
'2','19' || SUBSTR(PNUM,1,6),
'0','18' || SUBSTR(PNUM,1,6),
'9','18' || SUBSTR(PNUM,1,6))) / 10000),0)

FROM TEMP

;

 

하나씩 쪼개 보겠다.

 

위에 있는 WITH TEMP AS 부분은 가상으로 데이터를.만드는 부분이다.

 

데이터가 없을 때 유용하며, WITH 뒤에 있는 TEMP는 가상의.태이블 이름이다. 연습하거나 데이터 가공시 편리하다.

 

TRUNC(계산된값,0) 으로 되어 있는것은 계산된 값을 잘사한다. 0이면 소숫점 아래 수는 버린다. 1이면 첫째자리, 2이면 둘째자리까지표시한다.-1은1의자리, -2는.십단위로 바뀐다.

 

TO_CHAR(SYSDATE,'YYYYMMDD')

이 부분은 SYSDATE(현재날짜)를 'YYYYMMDD'형태로 변환한다.

 

DECODE(SUBSTR(PNUM, 7,1),
'3','20' || SUBSTR(PNUM,1,6),
'4','20' || SUBSTR(PNUM,1,6),
'1','19' || SUBSTR(PNUM,1,6),
'2','19' || SUBSTR(PNUM,1,6),
'0','18' || SUBSTR(PNUM,1,6),
'9','18' || SUBSTR(PNUM,1,6))

이 부분은 DECODE구문인데, DECODE는 IF랑 비슷하다. 그 안에 있는 SUBSTR먼저 보도록 하자.

SUBSTR은 '문자'를 '시작번호'에서 '길이'만큼 쪼갤때 사용한다.

 

PNUM의 내용 '1901021000000'를 시작번호 '7'부터 길이'1'만큼 자른다. 그러면 '1'이 됩니다.

그 뒤에 비교하는 부분이 나오는데, 하나씩 본다면

'3'이면 '20' || SUBSTR(PNUM,1,6)

이 부분은 '20'하고 뒤에 PNUM을 1에서 6길이만큼 자른값을 합친단 의미이다. DECODE처음 시작 부분의 값은 '1'이므로 이 구문은 건너뛰어 다음 구문으로 간다.

다음구문도 '4'이면...위의 내용과 동일하게 자른걸 붙인다 인데, 이것도 아니므로 다음..

'1'이면 '19' 와 뒤의 SUBSTR(PNUM,1,6)과 합친다. 

'19' || '190102'

'19190202'

이런 형태가 된다.

TRUNC((('현재날짜' - '19190102') / 10000),0)

이런 간단한 형태로 생각할 수 있다. 이렇게 하면 복잡해 보이는 부분도 쪼개서 하나씩 보면 편하게 볼 수 있다.