날짜계산 쿼리 좀 부탁드려요~ 1 5 1,203

by 산달 [SQL Query] [2016.06.21 16:02:31]


쿼리 도움을 요청합니다.

아래와 같을 경우 중복되는 날짜를 빼고 일수를 계산하고 싶습니다.

어떻게 쿼리를 짜야 될지 넘 힘드네요..

A 1993.09.25 ~ 1994.10.15

B 1994.10.05 ~ 1998.12.01

C 1998.10.03 ~ 2013.01.31

감사합니다.

by 우리집아찌 [2016.06.21 17:04:04]
/* 검증못함 ㅡㅡ; */

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
)

 


by 마농 [2016.06.21 17:14:41]
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
;

 


by jkson [2016.06.21 18:34:19]

중복데이터 안 만들고 찾네요. 굿이네요. 그걸 못해서 날짜 다 만들었는데-0-


by jkson [2016.06.21 17:54:39]
--재귀
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
     )
)

 


by 우리집아찌 [2016.06.21 19:23:55]

나도 distinct 쓸걸 ..  

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