2.IT/DB,ORACLE

[ORACLE] 일자 단일행 여러행으로 만들기

꿍스뿡이 2019. 6. 11. 09:00


 꿍스뿡이의 드림빌더 

ORACLE 날짜 레코드값을 여러행으로 보여주기

안녕하세요. 꿍스뿡이입니다!

ORACLE에서 가장 많이 사용하는것이 바로 날짜이지 않나 싶습니다. 

그 중에서도 시작일자부터, 종료일자의 값을 여러행에 걸쳐 표현해야하는 경우가 있는데요.

다음의 2가지 방법을 활용하여 해당 이슈를 처리할 수 있습니다.



기본데이터 및 조건


CASE 1 : 시작일자 종료일자에 해당하는 일수만큼 데이터 ROW단위로 표현하기

1. 테이블명 : TEST

2. 대상칼럼 : START_DT(시작일자) VARCAHR2(8 BYTE)

END_DT(종료일자) VARCAHR2(8 BYTE)

3. 현재데이터

START_DT 

 END_DT

 20190101

20190103 


4. 변경하고자 하는 데이터

DT 

 2019-01-01

 2019-01-02

 2019-01-03



CASE 2 : 키값을 기준으로, 시작일자 종료일자에 해당하는 일수만큼 데이터를 ROW단위로 각각 표현하기

1. 테이블명 : TEST

2. 대상칼럼 : BASE_KEY(키값) VARCHAR2(4 BYTE)

START_DT(시작일자) VARCAHR2(8 BYTE)

END_DT(종료일자) VARCAHR2(8 BYTE)

3. 현재데이터

BASE_KEY

START_DT

END_DT

KEY1

20190101 

20190103 

KEY2

20190103

20190105



4. 변경하고자 하는 데이터

BASE_KEY

DT

KEY1

2019-01-01

KEY1

2019-01-02

KEY1

2019-01-03

KEY2

2019-01-03

KEY2

2019-01-04

KEY2

2019-01-05





처리방법


처리방법은 아래와 같습니다. 

WITH부분을 수정하여 각자 상황에 맞게 사용하시면 될것 같습니다!


CASE1 : 시작일자 종료일자에 해당하는 일수만큼 데이터 ROW단위로 표현하기



WITH TEST AS 
(SELECT '20190101' AS START_DT, '20190103' AS END_DT FROM DUAL)
 SELECT * FROM TEST;

WITH TEST AS 
(SELECT '20190101' AS START_DT, '20190103' AS END_DT FROM DUAL)
 SELECT TO_CHAR(TO_DATE(START_DT, 'YYYYMMDD')+LEVEL-1, 'YYYY-MM-DD') AS DT
   FROM TEST
CONNECT BY LEVEL <= (TO_DATE(END_DT, 'YYYYMMDD')-TO_DATE(START_DT, 'YYYYMMDD')+1)


CASE2 : 키값을 기준으로, 시작일자 종료일자에 해당하는 일수만큼 데이터를 ROW단위로 각각 표현하기



WITH TEST AS 
(SELECT 'KEY1' AS BASE_KEY, '20190101' AS START_DT, '20190103' AS END_DT FROM DUAL
 UNION
 SELECT 'KEY2' AS BASE_KEY, '20190103' AS START_DT, '20190105' AS END_DT FROM DUAL)
 SELECT DISTINCT BASE_KEY, 
        TO_CHAR(TO_DATE(START_DT) + LEVEL -1 ,'YYYY-MM-DD') AS DT
   FROM TEST 
CONNECT BY LEVEL <= (TO_DATE(END_DT) - TO_DATE(START_DT) + 1)
ORDER BY BASE_KEY, DT



 

내용이 도움이 되셨거나 초보 블로거를 응원하고 싶으신 분은 아래 하트♥공감 버튼을 꾹 눌러주세요! 

내용의 수정이 있거나 도움이 필요하신 분은 댓글을 남겨주세요!