안녕하세요. 쿼리를 작성하는데 어려움이 있어 질문드립니다.
NO | 시작일자 | 시작시간 | 종료일자 | 종료시간 |
---|---|---|---|---|
1 | 20220324 | 1800 | 20220324 | 1900 |
2 | 20220324 | 2300 | 20220324 | 2330 |
3 | 20220324 | 2330 | 20220325 | 0000 |
테이블에 위처럼 데이터가 있을 때, 들어오는 데이터 기준으로 연속성을 체크하여 시작시간~종료시간의 총 시간을 구하고 싶습니다.
1. 20220324, 1930, 20220324, 2300 의 데이터가 들어오면
no1과는 19:00 19:30 30분의 간격이 있으므로 비연속, no2, no3과는 연속으로 19:30~00:00의 총 시간인 4시간 30분 계산
2. 20220324, 1900, 20220324, 2300 의 데이터가 들어오면
no1, no2, no3 모두와 연속으로 18:00~00:00의 총 시간인 6시간 계산
3. 20220324, 1930, 20220324, 2200 의 데이터가 들어오면
no1, no2, no3 모두와 비연속으로 19:30~22:00의 총 시간인 2시간 30분 계산
도움부탁드립니다.
WITH t0 AS ( SELECT 1 no, '20220324' sdt, '1800' stm, '20220324' edt, '1900' etm FROM dual UNION ALL SELECT 2, '20220324', '2300', '20220324', '2330' FROM dual UNION ALL SELECT 3, '20220324', '2330', '20220325', '0000' FROM dual ) , t1(no, sdt, stm, edt, etm) AS ( --SELECT 0 no, '20220324' sdt, '1930' stm, '20220324' edt, '2300' etm FROM dual --SELECT 0 no, '20220324' sdt, '1900' stm, '20220324' edt, '2300' etm FROM dual SELECT 0 no, '20220324' sdt, '1930' stm, '20220324' edt, '2200' etm FROM dual UNION ALL SELECT b.no, b.sdt, b.stm, b.edt, b.etm FROM t1 a , t0 b WHERE (a.sdt = b.edt AND a.stm = b.etm) OR (b.sdt = a.edt AND b.stm = a.etm) ) CYCLE no SET is_cycle TO 1 DEFAULT 0 SELECT TO_CHAR(TO_DATE(ROUND( ( TO_DATE(MAX(edt || etm), 'yyyymmddhh24mi') - TO_DATE(MIN(sdt || stm), 'yyyymmddhh24mi') ) * 24 * 60 * 60), 'sssss'), 'hh24:mi') tm FROM t1 WHERE is_cycle = 0 ;