두개의 날짜구간이 겹치는지 확인할 수 있는 방법이 있을까요? 0 2 1,218

by 문선린 [SQL Query] [2015.04.23 10:29:27]


with s as (
select 'a' aa, to_date('20150101','yyyymmdd') st, to_date('20150131','yyyymmdd') dt from dual union all
select 'a' aa, to_date('20150111','yyyymmdd') st, to_date('20150121','yyyymmdd') dt from dual
)
select *
  from s

 

두개의 날짜가 겹치는지.. 겹친다면 며칠이 겹치는지.. 확인할 수 있는 방법이 있을까요?

아무래도 생각이 안나서 여쭤봅니다.

 

 

by 창조의날개 [2015.04.23 10:50:04]

WITH S AS (
    SELECT 'a' AA, TO_DATE('20150101','yyyymmdd') ST, TO_DATE('20150131','yyyymmdd') DT FROM DUAL UNION ALL
    SELECT 'a' AA, TO_DATE('20150111','yyyymmdd') ST, TO_DATE('20150121','yyyymmdd') DT FROM DUAL UNION ALL
    SELECT 'B' AA, TO_DATE('20150101','yyyymmdd') ST, TO_DATE('20150130','yyyymmdd') DT FROM DUAL UNION ALL
    SELECT 'B' AA, TO_DATE('20150131','yyyymmdd') ST, TO_DATE('20150221','yyyymmdd') DT FROM DUAL
)
SELECT AA, MIN(DT) - MAX(ST) + 1
  FROM S
GROUP BY AA
;

 


by 마농 [2015.04.23 12:24:57]
WITH s AS
(
SELECT 1 pk, 'a' aa, TO_DATE('20150101', 'yyyymmdd') st, TO_DATE('20150131', 'yyyymmdd') dt FROM dual
UNION ALL SELECT 2, 'a', TO_DATE('20150111', 'yyyymmdd'), TO_DATE('20150121', 'yyyymmdd') FROM dual
)
-- 겹치는 구간 검색은 시작과 종료를 서로 교차하여 비교합니다.
SELECT a.*
     , b.*
     , GREATEST(a.st, b.st) sdt
     , LEAST(a.dt, b.dt) edt
     , LEAST(a.dt, b.dt) - GREATEST(a.st, b.st) + 1 AS cnt
  FROM s a
     , s b
 WHERE a.aa = b.aa
   AND a.pk != b.pk
   AND a.st <= b.dt
   AND a.dt >= b.st
;

 

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