날짜 구간을 '년말' 기준으로 나누고 싶습니다. 0 2 2,880

by 란돌 [SQL Query] [2014.09.29 14:07:25]


SELECT '20120105' 시작일, '20120420' 종료일, 'A' 구분 FROM dual
UNION ALL 
SELECT '20120421' 시작일, '20130702' 종료일, 'B' 구분 FROM dual
UNION ALL
SELECT '20130703' 시작일, '20140904' 종료일, 'C' 구분 FROM dual 

 

시작일 | 종료일 | 구분

20120105    20120420    A
20120421    20130702    B
20130703    20140904    C

위와 같은 데이타를 '년말'이 껴있는 경우 아래와 같이 만들고 싶습니다.

시작일 | 종료일 | 구분

20120105    20120420    A

20120421    20121231    B

20130101    20130702    B

20130703    20131231    C

20140101    20140904    C

계속 고민중인데 한방쿼리로 쉽게 떠오르지가 않네요

고수님들의 가르침 부탁드립니다 (__)

by 마농 [2014.09.29 15:10:06]
WITH t AS
(
SELECT '20120105' sdt, '20120420' edt, 'A' gb FROM dual
UNION ALL SELECT '20120421', '20130702', 'B' FROM dual
UNION ALL SELECT '20130703', '20140904', 'C' FROM dual
)
SELECT GREATEST(sdt, SUBSTR(sdt, 1, 4) + lv - 1 || '0101') sdt
     , LEAST   (edt, SUBSTR(sdt, 1, 4) + lv - 1 || '1231') edt
     , gb
  FROM t
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9)
 WHERE lv <= SUBSTR(edt, 1, 4) - SUBSTR(sdt, 1, 4) + 1
 ORDER BY gb, lv
;

 


by 란돌 [2014.09.29 15:24:28]

헙 마농님 완전 감사드립니다!!

잘 보고 제걸로 만들께요 : )

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