database.sarang.net
UserID
Passwd
Database
DBMS
MySQL
PostgreSQL
Firebird
ㆍOracle
Informix
Sybase
MS-SQL
DB2
Cache
CUBRID
LDAP
ALTIBASE
Tibero
DB 문서들
스터디
Community
공지사항
자유게시판
구인|구직
DSN 갤러리
도움주신분들
Admin
운영게시판
최근게시물
Oracle Q&A 39690 게시물 읽기
No. 39690
날짜 기간(일수) 구하는 쿼리 도움 부탁드립니다.
작성자
Jacob(thaad)
작성일
2012-10-18 08:34ⓒ
2012-10-18 09:54ⓜ
조회수
5,939

예를 들면,

dt                      st                     ed
20110314       20110313     20110314
20110315       20110314     20110315
20110316       20110316     20110316
20110317       20110316     20110317
20110318       20110318     20110318
20110321       20110321     20110321
20110322       20110322     20110322
20110325       20110325     20110325
20110327       20110325     20110327

 

이런 날짜 데이터가 있는데, 저 것으로 구하고자 하는 데이터는

min(st), max(ed), 일수(max(ed) - min(st) 사이 일수) 와 같은 데이터를 구하고자 합니다.

일수의 경우 단순 max(ed) - min(st)가 아닌...

 

예를 들면 st가 20110313, ed가 20110314의 경우 13, 14로 총 2일이 구해져야 하며,

따라서 위의 데이터로는 시작한 날 min(st) 부터 끝난 날 max(ed) 까지

(13, 14, 15, 16, 17, 18, 21, 22, 25, 26, 27) 총 11일로 구해지는 쿼리를 짜고 싶은데,

즉, 구하고자 하는 값은,

min(st)             max(ed)          일수
20110313          20110327         11일

위와 같습니다.

쿼리를 어떻게 짜야할지 막막하기만 합니다.

 

무림 고수분들의 도움 부탁드립니다.

이 글에 대한 댓글이 총 2건 있습니다.

1. 시작날짜가 같은 경우가 있으므로 시작날짜로 그룹핑 해서 ST와 MAX(ED)를 구합니다.

2. ED와 ST를 TO_DATE 해서 뺍니다.

    날짜의 차이를 구하는게 아니라 일수를 구하는것이므로 1을 더합니다.

    여기서 ED와 다음 ROW의 ST가 같은 경우는 중복되서 더해지는 경우가 발생하므로 이 때는 1을 더하지 않습니다.

 

WITH V AS

(

    SELECT '20110314' DT,       '20110313' ST,     '20110314' ED FROM DUAL UNION ALL

    SELECT '20110315' DT,       '20110314' ST,     '20110315' ED FROM DUAL UNION ALL

    SELECT '20110316' DT,       '20110316' ST,     '20110316' ED FROM DUAL UNION ALL

    SELECT '20110317' DT,       '20110316' ST,     '20110317' ED FROM DUAL UNION ALL

    SELECT '20110318' DT,       '20110318' ST,     '20110318' ED FROM DUAL UNION ALL

    SELECT '20110321' DT,       '20110321' ST,     '20110321' ED FROM DUAL UNION ALL

    SELECT '20110322' DT,       '20110322' ST,     '20110322' ED FROM DUAL UNION ALL

    SELECT '20110325' DT,       '20110325' ST,     '20110325' ED FROM DUAL UNION ALL

    SELECT '20110327' DT,       '20110325' ST,     '20110327' ED FROM DUAL

)

SELECT SUM(DD+TMP)

FROM  (

        SELECT DT

             , ST

             , ED

             , TO_DATE(ED) - TO_DATE(ST) DD

             , CASE WHEN ED = LEAD_ST

                    THEN 0

                    ELSE 1

               END TMP

        FROM  (

                SELECT DT

                     , ST

                     , ED

                     , LEAD(ST) OVER(ORDER BY DT) LEAD_ST

                     , LEAD(ED) OVER(ORDER BY ED) LEAD_ED

                FROM  (

                        SELECT MIN(DT) DT

                             , ST

                             , MAX(ED) ED

                        FROM   V

                        GROUP BY ST

                      )

              )

      )

 

햇살한조각님이 2012-10-18 11:46에 작성한 댓글입니다. Edit

이런 방법이 있었네요??!!

생각보다 완전 간단하네요.

감사합니다~

좋은 것 하나 배워갑니다ㅋ

꾸벅 (^.^) (_._) 

Jacob(thaad)님이 2012-10-18 13:58에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
39693쿼리 조언 부탁합니다. [1]
치우천황
2012-10-19
4401
39692db 백업/복구 명령어 문의.
김삼
2012-10-19
4307
39691pro [테이블명]; [1]
이경일
2012-10-18
4082
39690날짜 기간(일수) 구하는 쿼리 도움 부탁드립니다. [2]
Jacob
2012-10-18
5939
39689주 단위 누적치 계산 방법??? [4]
누적계산
2012-10-17
5746
39688tablespace 일별/시간별 총사용량 구하기 질문 ㅠ [1]
DB초보사람
2012-10-16
6225
39687ORA-01843 재질문 ㅠ.ㅠ [1]
해외
2012-10-13
5107
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2024 DSN, All rights reserved.
작업시간: 0.017초, 이곳 서비스는
	PostgreSQL v16.2로 자료를 관리합니다