시작종료일자가 있는 데이터를 로우로 조회하기 0 5 1,801

by 엘시아 [SQL Query] 날짜 시작일 종료일 로우 ROW데이터 [2020.10.20 14:15:20]


안녕하세요

 

시작일      종료일      구분

20201005 2020107    A

20201120 20201122    B

라는 데이터를 

시작종료일자를 로우로 만들고싶습니다.

 일자        구분

20201015   A

20201006   A

20201007   A

20201120   B 

20201121   B

20201122   B

 

어렵네요 도와주세요 감사합니다 ㅎㅎ..

 

by pajama [2020.10.20 14:50:02]

강좌 참고해서 만들어봤습니다~

http://www.gurubee.net/article/55635

 

with t as (
select '20201005' 시작일, '20201007' 종료일, 'A' 구분 from dual
union all select '20201120', '20201122', 'B' from dual
)
select *
from (
select 시작일 + lv - 1 일자, 구분
from t, (select level lv from dual connect by level <= 30)
where lv <= 종료일 - 시작일 + 1
)
order by 일자, 구분

 


by 마농 [2020.10.20 16:17:37]

 

○ 날짜로 변환하여 연산해야 합니다.
예1) 종료일 - 시작일 + 1 = '20201101' - '20201031' + 1 = ?
- 예상 결과(정상) :  2
- 실제 결과(오류) : 71
예2) 시작일 + lv - 1 = '20201031' + lv - 1 = ?
- 예상 결과(정상) : 20201031, 20201101
- 실제 결과(오류) : 20201031, 20201032, 20201033, ... , 20201099, 20201100, 20201101


by 마농 [2020.10.20 16:23:40]
WITH t AS
(
SELECT '20201005' sdt, '20201007' edt, 'A' gb FROM dual
UNION ALL SELECT '20201120', '20201122', 'B'  FROM dual
UNION ALL SELECT '20201031', '20201101', 'C'  FROM dual
)
SELECT gb
     , TO_CHAR(s + lv - 1, 'yyyymmdd') dt
  FROM (SELECT gb
             , TO_DATE(sdt, 'yyyymmdd') s
             , TO_DATE(edt, 'yyyymmdd') e
          FROM t
        ) a
     , (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 99) b
 WHERE lv <= e - s + 1
 ORDER BY gb, dt
;

 


by pajama [2020.10.20 17:43:04]

지적 감사합니다~ 결과에만 급급했군요 ㅜ.ㅜ


by 엘시아 [2020.11.02 17:04:04]

마농님 pajama님 답변 감사합니다 :)

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