안녕하세요. 쿼리를 작성하는데 어려움이 있어 질문드립니다.
| 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
;
감사합니다!!