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 41748 게시물 읽기
No. 41748
날짜 구간별 분할에 대한 문의입니다.
작성자
손미옥(somdary)
작성일
2019-08-06 01:00:05
조회수
200

안녕하세요.
SQL 도움을 얻고자 질문 남깁니다.

[입력데이터]
FR_DT, TO_DT
20120101, 20181231
20130401, 20160531
20140701, 20181231
20120101, 20170630

[결과데이터]
RN, ST_DT, ED_DT
1, 20170101, 20130331
2, 20130401, 20130521
3, 20130522, 20140630
4, 20140701, 20160531
5, 20160601, 20170630
6, 20170701, 20181231

[조건]
1. 입력데이터는 FROM~TO로 자유롭게 입력합니다.
   - 날짜는 중간에 끊김없이 입력됩니다.
2. 결과데이터와 같이 중복구간 없이 날짜가 분할되어야합니다.
3. 날짜구간안에 20130521일 있으면 분할되어야합니다.
   - 20130521도 시작일 또는 종료일에 입력할 수 있습니다.

[샘플]
WITH TMP_DT_LIST(FR_DT, TO_DT) AS (
 SELECT '20120101', '20181231' FROM DUAL UNION ALL
 SELECT '20130401', '20160531' FROM DUAL UNION ALL
 SELECT '20140701', '20181231' FROM DUAL UNION ALL
 SELECT '20120101', '20170630' FROM DUAL
)
SELECT *
  FROM TMP_DT_LIST
;

 

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

From~To를 일렬로 재정렬 한다고 생각하시면 됩니다.

To 다음날이 From이 되어야 한다는 것도 감안해야 함

따라서 모두 From일로 만들어 정렬하고 다음 From일 -1 이 이전행의 To_DT가 되면 되겠죠

그리고 조건 3에 의해 20130521을 (결과데이터로 봤을 때) 종료일에 추가해 주면 됩니다.

그래서 아래와 같은 쿼리가 나오네요.

 

WITH TMP_DT_LIST(FR_DT, TO_DT) AS (
  SELECT '20120101', '20181231' FROM DUAL UNION ALL
  SELECT '20130401', '20160531' FROM DUAL UNION ALL
  SELECT '20140701', '20181231' FROM DUAL UNION ALL
  SELECT '20120101', '20170630' FROM DUAL
 )
select to_char(fr_dt, 'YYYYMMDD') fr_dt, to_char(to_dt, 'YYYYMMDD') to_dt
from (
    select dt AS fr_dt, lead(dt-1, 1) over( order by dt) AS to_dt
    from (
         select distinct dt
         from (
             SELECT 
                to_date(fr_dt, 'YYYYMMDD') dt
               FROM TMP_DT_LIST
             union all 
             SELECT 
                to_date(to_dt, 'YYYYMMDD') + 1 dt
             FROM TMP_DT_LIST
             union all
             SELECT 
                to_date('20130521', 'YYYYMMDD') + 1 dt
             FROM dual
         ) lst
         order by dt
    )     
 ) 
 where to_dt is not null
 ; 
박인호(paerae)님이 2019-08-06 10:33:59에 작성한 댓글입니다.
[Top]
No.
제목
작성자
작성일
조회
41751오라클 제약조건 비활성화->활성화 후 imp 안됨 [1]
노진규
2019-08-16
157
41750조언을 구하고자 합니다.(이력관리)
기쁨이
2019-08-16
157
41749하루 시간의 데이터 뽑기 [1]
게스트
2019-08-09
212
41748날짜 구간별 분할에 대한 문의입니다. [1]
손미옥
2019-08-06
200
41747수동으로 테이블별 통계분석 설정시.... [1]
나경민
2019-08-01
182
41746LISTAGG 함수사용하여 중복제거방법 문의드립니다. [1]
딸기쥬스
2019-08-01
263
41745다음행 연결고리 쿼리 어떻게 하면 되나요? [1]
궁금이
2019-07-29
216
Valid XHTML 1.0!
All about the DATABASE... Copyleft 1999-2019 DSN, All rights reserved.
작업시간: 0.074초, 이곳 서비스는
	PostgreSQL v11.5로 자료를 관리합니다