/* 검증못함 ㅡㅡ; */ WITH T1 (ST_DT , END_DT ) AS ( SELECT '1993.09.25' , '1994.10.15' FROM DUAL UNION ALL SELECT '1994.10.05' , '1998.12.01' FROM DUAL UNION ALL SELECT '1998.10.03' , '2013.01.31' FROM DUAL ) , T2 AS( SELECT LEVEL LV FROM DUAL CONNECT BY LEVEL <= 10000 ) SELECT COUNT(*) FROM ( SELECT DT FROM (SELECT TO_CHAR(TO_DATE(ST_DT,'YYYY.MM.DD') + LV - 1 ,'YYYY-MM-DD')DT FROM T1 , T2 WHERE ( TO_DATE(END_DT,'YYYY.MM.DD') - TO_DATE(ST_DT,'YYYY.MM.DD')) + 1 >= T2.LV ) GROUP BY DT )
WITH t AS ( SELECT 'A' cd, '1993.09.25' sdt, '1994.10.15' edt FROM dual UNION ALL SELECT 'B', '1994.10.05', '1998.12.01' FROM dual UNION ALL SELECT 'C', '1998.10.03', '2013.01.31' FROM dual ) SELECT SUM(TO_DATE(MAX(edt), 'yyyy.mm.dd') - TO_DATE(MIN(sdt), 'yyyy.mm.dd') + 1) cnt FROM (SELECT cd, sdt, edt , SUM(flag) OVER(ORDER BY sdt, edt) gb FROM (SELECT cd, sdt, edt , CASE WHEN MAX(edt) OVER(ORDER BY sdt, edt ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) >= sdt THEN 0 ELSE 1 END flag FROM t ) ) GROUP BY gb ;
--재귀 WITH T1 (ST_DT , END_DT ) AS ( SELECT TO_DATE('1993-09-25','YYYY-MM-DD') , TO_DATE('1994-10-15','YYYY-MM-DD') FROM DUAL UNION ALL SELECT TO_DATE('1994-10-05','YYYY-MM-DD') , TO_DATE('1998-12-01','YYYY-MM-DD') FROM DUAL UNION ALL SELECT TO_DATE('1998-10-03','YYYY-MM-DD') , TO_DATE('2013-01-31','YYYY-MM-DD') FROM DUAL ) ,T2 (ST_DT, END_DT) AS ( SELECT ST_DT, END_DT FROM T1 UNION ALL SELECT ST_DT + 1, END_DT FROM T2 WHERE ST_DT < END_DT ) SELECT COUNT(DISTINCT ST_DT) FROM T2 --model WITH T1 (ST_DT , END_DT ) AS ( SELECT TO_DATE('1993-09-25','YYYY-MM-DD') , TO_DATE('1994-10-15','YYYY-MM-DD') FROM DUAL UNION ALL SELECT TO_DATE('1994-10-05','YYYY-MM-DD') , TO_DATE('1998-12-01','YYYY-MM-DD') FROM DUAL UNION ALL SELECT TO_DATE('1998-10-03','YYYY-MM-DD') , TO_DATE('2013-01-31','YYYY-MM-DD') FROM DUAL ) SELECT COUNT(1) DAYCNT FROM ( SELECT DISTINCT ST_DT FROM (SELECT ROWNUM AS RN, T1.* FROM T1) MODEL PARTITION BY (RN) DIMENSION BY (0 AS DAYS) MEASURES(ST_DT, END_DT) RULES ( ST_DT[FOR DAYS FROM 1 TO END_DT[0]-ST_DT[0] INCREMENT 1] = ST_DT[0] + CV(DAYS), END_DT[ANY] = ST_DT[CV()] + 1 ) )