기간의 차집합을 구하는 방법에 대해서 질문입니다. 0 4 946

by 베가스 [SQL Query] [2015.12.16 16:42:53]


예약가능 테이블 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시

이런식으로 나와야 되는데...  방법이 있을까요?

by swlee710 [2015.12.16 17:53:50]
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;

 


by 베가스 [2015.12.16 20:23:15]

group by 방법에 이마를 탁 치고 갑니다.

엄청난 도움이 되었습니다.

감사합니다.


by 마농 [2015.12.17 11:13:35]
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
;

 


by 베가스 [2015.12.17 14:58:06]

답변 감사합니다.

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입