예약가능 테이블 A
(룸번호, 예약가능시작일자(YYYYMMDD HH24MI), 예약가능종료일자(YYYYMMDD HH24MI))
예약 테이블 B
(룸번호, 예약시작일자(YYYYMMDD HH24MI), 예약종료일자(YYYYMMDD HH24MI))
A 테이블 데이터는
1번룸 12월 1일 00시 ~ 12월 10일 24시
1번룸 12월 15일 00시 ~ 12월 20일 24시
이런 식으로 데이터가 있고
B 테이블 데이터는
1번룸 12월 2일 09시 ~ 12월 3일 24시
1번룸 12월 16일 14시 ~ 12월 19일 24시
이런 식으로 데이터가 있습니다.
원하는 결과는
B테이블의 예약 데이터를 제외한 A테이블의 예약가능기간입니다.
12월 1일 00시 ~ 12월 2일 09시
12월 4일 00시 ~ 12월 10일 24시
12월 15일 00시 ~ 12월 16일 14시
12월 20일 00시 ~ 12월 20일 24시
이런식으로 나와야 되는데... 방법이 있을까요?
24시가 애매하네요.. WITH A (NO, SDT, EDT) AS ( SELECT 1, '201512010000' , '201512110000' FROM DUAL UNION ALL SELECT 1, '201512150000' , '201512210000' FROM DUAL ),B (NO, SDT, EDT) AS ( SELECT 1, '201512020900' , '201512040000' FROM DUAL UNION ALL SELECT 1, '201512161400' , '201512200000' FROM DUAL ) select min(dt) sdt, max(dt) edt from( select dt,TO_DATE(dt,'YYYYMMDDHH24MI') - (rownum/24) gb from ( SELECT dt FROM A,(SELECT TO_CHAR(TO_DATE('201512010000','YYYYMMDDHH24MI')+ ((LEVEL-1)/24),'YYYYMMDDHH24MI') dt FROM DUAL CONNECT BY LEVEL <= 745) c where a.sdt <= dt and a.edt >= dt minus SELECT dt FROM b,(SELECT TO_CHAR(TO_DATE('201512010000','YYYYMMDDHH24MI')+ ((LEVEL-1)/24),'YYYYMMDDHH24MI') dt FROM DUAL CONNECT BY LEVEL <= 745) c where b.sdt <= dt and b.edt >= dt)) group by gb order by sdt;
WITH a AS ( SELECT 1 no, '2015120100' sdt, '2015121100' edt FROM dual UNION ALL SELECT 1, '2015121500', '2015122100' FROM dual ) , b AS ( SELECT 1 no, '2015120209' sdt, '2015120400' edt FROM dual UNION ALL SELECT 1, '2015121614', '2015122000' FROM dual ) SELECT sdt, edt FROM (SELECT sdt , LEAD(sdt) OVER(ORDER BY sdt) edt , SUM(SUM(st)) OVER(ORDER BY sdt) st FROM (SELECT sdt, 1 st FROM a UNION ALL SELECT edt, -1 FROM a UNION ALL SELECT sdt, -1 FROM b UNION ALL SELECT edt, 1 FROM b ) GROUP BY sdt ) WHERE st = 1 ;