원본쿼리가
with t ( st, cnt, start_date, end_date) as ( select 12, 2, '20171120122000', '20171120132000' from dual union all select 15, 1, '20171120151000', '20171120152000' from dual ) select * from t ;
이구요 결과는 아래와같이나와야하는데요 어렵네요 ㅠㅠ
| LV | ST | DIFF_TIME | START_TIME | END_TIME |
| 1 | 12 | 1 | 20171120122000 | 20171120125959 |
| 2 | 13 | 1 | 20171120130000 | 20171120132000 |
| 3 | 15 | 1 | 20171120151000 | 20171120152000 |
LV 은 LEVEL 이구
ST는 20171120122000 이면 12시 를 말하는거구요
원본데이터가 만약에 20171120122000 ~ 20171120132000 이면
START_TIME( 20171120122000 ) ~ END_TIME( 20171120125959 ) 로 강제 짤라서 레코드개수를 늘려주는겁니다( 시간단위로 )
WITH t(id, start_date, end_date) AS
(
SELECT 1, '20171120122000', '20171120132000' FROM dual UNION ALL
SELECT 2, '20171120151000', '20171120152000' FROM dual
)
SELECT id
, start_date, end_date
, lv
, TO_CHAR(GREATEST(sdt, TRUNC(sdt, 'hh') + (lv - 1) / 24) , 'yyyymmddhh24miss') sdt
, TO_CHAR(LEAST(edt, TRUNC(sdt, 'hh') + lv / 24 - 1/24/60/60), 'yyyymmddhh24miss') edt
FROM (SELECT id, start_date, end_date
, TO_DATE(start_date, 'yyyymmddhh24miss') sdt
, TO_DATE( end_date, 'yyyymmddhh24miss') edt
FROM t
)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
WHERE lv <= (TRUNC(edt, 'hh') - TRUNC(sdt, 'hh')) * 24 + 1
ORDER BY id, lv
;
많은 도움돼었습니다 감사합니다
이해를위해서 제가 답변단겁니다..
1. GREATEST ( t.sdt, T_SDT ) => SDT
2. LEAST ( t.edt, T_EDT ) = > EDT
WITH t(id, start_date, end_date) AS
(
SELECT 1, '20171120122000', '20171120132000' FROM dual UNION ALL
SELECT 2, '20171120151000', '20171120152000' FROM dual
)
SELECT id
, start_date, end_date
, lv
, TO_CHAR(TRUNC(GREATEST(sdt, TRUNC(sdt, 'hh') + (lv - 1) / 24), 'hh'),'HH24') qhour
, TO_CHAR(GREATEST(sdt, TRUNC(sdt, 'hh') + (lv - 1) / 24) , 'yyyymmddhh24miss') sdt
, TO_CHAR(LEAST(edt, TRUNC(sdt, 'hh') + lv / 24 - 1/24/60/60), 'yyyymmddhh24miss') edt
, TRUNC(sdt, 'hh') + (lv - 1) / 24 t_sdt
, TRUNC(sdt, 'hh') + lv / 24 - 1/24/60/60 t_edt
FROM (SELECT id, start_date, end_date
, TO_DATE(start_date, 'yyyymmddhh24miss') sdt
, TO_DATE( end_date, 'yyyymmddhh24miss') edt
FROM t
)
, (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99)
WHERE lv <= (TRUNC(edt, 'hh') - TRUNC(sdt, 'hh')) * 24 + 1
ORDER BY id, lv
;