예전 마농님이 작성해주신 쿼리입니다.
여기서 휴계시간(with절)이 23:00 ~ 01:00 일경우에는 해당시간을 제외 해야하는데 시간 계산이 제대로 되지 않는거 같습니다.
제대로 계산이 되도록 도움 부탁드립니다.
감사합니다.
WITH t AS
(
SELECT '0000' stm, '0100' etm FROM dual
UNION ALL SELECT '1200', '1300' FROM dual
)
SELECT SUM(a.e - a.s - NVL(SUM(LEAST(a.e, b.e) - GREATEST(a.s, b.s)), 0)) mi
FROM (SELECT LEVEL lv
, DECODE(LEVEL, 1, TO_CHAR(sdt, 'sssss') / 60, 0) s
, DECODE(LEVEL, TRUNC(edt) - TRUNC(sdt) + 1, TO_CHAR(edt, 'sssss') / 60, 24*60) e
FROM (SELECT TO_DATE('2017-06-12 11:00', 'yyyy-mm-dd hh24:mi') sdt
, TO_DATE('2017-06-14 11:00', 'yyyy-mm-dd hh24:mi') edt
FROM dual
)
CONNECT BY LEVEL <= TRUNC(edt) - TRUNC(sdt) + 1
) a
, (SELECT SUBSTR(stm, 1, 2) * 60 + SUBSTR(stm, 3) s
, SUBSTR(etm, 1, 2) * 60 + SUBSTR(etm, 3) e
FROM t
) b
WHERE a.s < b.e(+)
AND a.e > b.s(+)
GROUP BY a.lv, a.s, a.e
WITH exc_t AS ( --SELECT '0000' stm, '0100' etm FROM dual SELECT '2300' stm, '0100' etm FROM dual UNION ALL SELECT '1200', '1300' FROM dual ) , data_t AS ( SELECT TO_DATE('2017-06-12 11:00', 'yyyy-mm-dd hh24:mi') sdt , TO_DATE('2017-06-14 11:00', 'yyyy-mm-dd hh24:mi') edt FROM dual ) SELECT SUM(a.e - a.s - NVL(SUM(LEAST(a.e, b.e) - GREATEST(a.s, b.s)), 0)) mi FROM (SELECT lv , DECODE(lv, 1, TO_CHAR(sdt, 'sssss') / 60, 0) s , DECODE(lv, TRUNC(edt) - TRUNC(sdt) + 1, TO_CHAR(edt, 'sssss') / 60, 24*60) e FROM data_t , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 9) WHERE lv <= TRUNC(edt) - TRUNC(sdt) + 1 ) a , (SELECT CASE WHEN stm > etm AND lv = 2 THEN 0 ELSE SUBSTR(stm, 1, 2) * 60 + SUBSTR(stm, 3) END s , CASE WHEN stm > etm AND lv = 1 THEN 24*60 ELSE SUBSTR(etm, 1, 2) * 60 + SUBSTR(etm, 3) END e FROM exc_t , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 2) WHERE lv <= CASE WHEN stm > etm THEN 2 ELSE 1 END ) b WHERE a.s < b.e(+) AND a.e > b.s(+) GROUP BY a.lv, a.s, a.e ;