꿍스뿡이의 드림빌더
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
내용이 도움이 되셨거나 초보 블로거를 응원하고 싶으신 분은 아래 하트♥공감 버튼을 꾹 눌러주세요!
내용의 수정이 있거나 도움이 필요하신 분은 댓글을 남겨주세요!
'2.IT > DB,ORACLE' 카테고리의 다른 글
[ORACLE] 오라클 여러 행을 하나의 컬럼으로 만들기2 (LISTAGG ) (1) | 2020.07.16 |
---|---|
[ORACLE] 오라클 여러 행을 하나의 컬럼으로 만들기 (LISTAGG ) (0) | 2020.07.07 |
[ORA-01850] 시간은 0에서 23 사이어야 합니다. 해결방법. (0) | 2019.05.08 |
[SQL] PROCEDURE (프로시저) (0) | 2018.10.27 |
[SQL] MERGE문 (한번에 INSERT, UPDATE) (2) | 2018.10.24 |