* 주말 아닌 공휴일은 운영하시는 내용으로 추가 필요
SELECT sdttm "시작일시", edttm "종료일시" , sum(CASE WHEN TRUNC(sdttm) = gen_dt THEN (1 - (sdttm - gen_dt))*(24*60) WHEN TRUNC(edttm) = gen_dt THEN (edttm - gen_dt)*(24*60) ELSE (24*60) END ) AS "차이(분)" FROM ( SELECT TO_DATE('20241018 14:30', 'YYYYMMDD HH24:MI') AS sdttm ,TO_DATE('20241021 15:30', 'YYYYMMDD HH24:MI') AS edttm FROM dual ) tbl, ( SELECT TRUNC(TO_DATE('20241018 14:30', 'YYYYMMDD HH24:MI')) + LEVEL -1 AS gen_dt , TO_CHAR(TO_DATE('20241018 14:30', 'YYYYMMDD HH24:MI') + LEVEL -1, 'D') AS yoil FROM DUAL CONNECT BY LEVEL <= TO_DATE('20241021 15:30', 'YYYYMMDD HH24:MI') - TO_DATE('20241018 14:30', 'YYYYMMDD HH24:MI') +1 ) genTbl WHERE genTbl.yoil NOT IN ('1','7')
달력 테이블을 하나 민들어 두고 조인하여 사용하세요.
일수가 아닌 시간 정보라면? 휴식시간은 따로 없는지?
WITH t_calendar AS ( -- 달력 테이블 미리 만들어 두고 사용하세요. SELECT dt , CASE WHEN TO_CHAR(dt, 'yyyymmdd') IN ('20241003', '20241009') THEN 0 WHEN TO_CHAR(dt, 'd') IN ('1', '7') THEN 0 ELSE 1 END cnt FROM (SELECT TO_DATE('202410', 'yyyymm') + LEVEL - 1 dt FROM dual CONNECT BY LEVEL <= 31 ) ) SELECT SUM(ROUND((LEAST(dt + 1, edt) - GREATEST(dt, sdt)) * cnt * 24 * 60)) minute_ FROM (SELECT TO_DATE('20241018 14:30', 'yyyymmdd hh24:mi') sdt , TO_DATE('20241021 15:30', 'yyyymmdd hh24:mi') edt FROM dual ) a , t_calendar b WHERE dt BETWEEN TRUNC(sdt) AND edt ;