반응형
CONNECT BY 구문을 이용해서 날짜 테이블을 만들 수 있다.
계층형 질의에서 쓰이는 구문이지만 조금 응용을 하면 원하는 범위의 날짜를 구할 수 있다.
아래의 예시를 보자.
SELECT LEVEL
FROM DUAL
CONNECT BY LEVEL < 5;
LEVEL
----------
1
2
3
4
CONNECT BY를 조건절 처럼 걸었더니 4개의 행만이 나왔다. LEVEL 값이 차례대로 4까지 나온 것을 응용하여 금일 기준 +3 일까지 구할 수 있다.
SELECT LEVEL
, SYSDATE + (LEVEL -1)
FROM DUAL
CONNECT BY LEVEL < 5;
LEVEL SYSDATE+(LEV
---------- ------------
1 05-MAY-23
2 06-MAY-23
3 07-MAY-23
4 08-MAY-23
LEVEL값은 출력되는 행의 갯수만큼 나오게 되는 점을 이용하여 CONNECT BY 절을 수정하여 마치 조건절처럼 사용하면 일정 범위의 날짜를 구할 수 있다.
SELECT LEVEL
, SYSDATE + (LEVEL -1)
FROM DUAL
CONNECT BY SYSDATE + (LEVEL -1) <= TO_DATE('20230531','YYYY-MM-DD');
LEVEL SYSDATE+(LEV
---------- ------------
1 05-MAY-23
2 06-MAY-23
3 07-MAY-23
4 08-MAY-23
5 09-MAY-23
6 10-MAY-23
7 11-MAY-23
8 12-MAY-23
9 13-MAY-23
10 14-MAY-23
11 15-MAY-23
LEVEL SYSDATE+(LEV
---------- ------------
12 16-MAY-23
13 17-MAY-23
14 18-MAY-23
15 19-MAY-23
16 20-MAY-23
17 21-MAY-23
18 22-MAY-23
19 23-MAY-23
20 24-MAY-23
21 25-MAY-23
22 26-MAY-23
LEVEL SYSDATE+(LEV
---------- ------------
23 27-MAY-23
24 28-MAY-23
25 29-MAY-23
26 30-MAY-23
이를 이용해서 2023년 5월 한달의 날짜 데이터를 출력해본다.
SELECT LEVEL
, TRUNC(SYSDATE,'MM') + (LEVEL -1)
FROM DUAL
CONNECT BY TRUNC(SYSDATE,'MM') + (LEVEL -1) <= TO_DATE('20230531','YYYY-MM-DD');
LEVEL TRUNC(SYSDAT
---------- ------------
1 01-MAY-23
2 02-MAY-23
3 03-MAY-23
4 04-MAY-23
5 05-MAY-23
6 06-MAY-23
7 07-MAY-23
8 08-MAY-23
9 09-MAY-23
10 10-MAY-23
11 11-MAY-23
LEVEL TRUNC(SYSDAT
---------- ------------
12 12-MAY-23
13 13-MAY-23
14 14-MAY-23
15 15-MAY-23
16 16-MAY-23
17 17-MAY-23
18 18-MAY-23
19 19-MAY-23
20 20-MAY-23
21 21-MAY-23
22 22-MAY-23
LEVEL TRUNC(SYSDAT
---------- ------------
23 23-MAY-23
24 24-MAY-23
25 25-MAY-23
26 26-MAY-23
27 27-MAY-23
28 28-MAY-23
29 29-MAY-23
30 30-MAY-23
31 31-MAY-23
이제 원하는대로 데이터를 가공해서 컬럼을 추가하면 날짜 데이터 생성 완료
SELECT TRUNC(SYSDATE,'MM') + (LEVEL -1)
, TO_CHAR(TRUNC(SYSDATE,'MM') + (LEVEL -1),'YYYYMMDD')
, TO_CHAR(TRUNC(SYSDATE,'MM') + (LEVEL -1),'YYYY')
, TO_CHAR(TRUNC(SYSDATE,'MM') + (LEVEL -1),'MM')
, TO_CHAR(TRUNC(SYSDATE,'MM') + (LEVEL -1),'DD')
, TO_CHAR(TRUNC(SYSDATE,'MM') + (LEVEL -1),'DY','NLS_DATE_LANGUAGE=korean')
FROM DUAL
CONNECT BY TRUNC(SYSDATE,'MM') + (LEVEL -1) <= TO_DATE('20230531','YYYY-MM-DD');
TRUNC(SYSDAT TO_CHAR(TRUNC(SY TO_CHAR( TO_C TO_C TO_CHAR(
------------ ---------------- -------- ---- ---- --------
01-MAY-23 20230501 2023 05 01 월
02-MAY-23 20230502 2023 05 02 화
03-MAY-23 20230503 2023 05 03 수
04-MAY-23 20230504 2023 05 04 목
05-MAY-23 20230505 2023 05 05 금
06-MAY-23 20230506 2023 05 06 토
07-MAY-23 20230507 2023 05 07 일
08-MAY-23 20230508 2023 05 08 월
09-MAY-23 20230509 2023 05 09 화
10-MAY-23 20230510 2023 05 10 수
11-MAY-23 20230511 2023 05 11 목
TRUNC(SYSDAT TO_CHAR(TRUNC(SY TO_CHAR( TO_C TO_C TO_CHAR(
------------ ---------------- -------- ---- ---- --------
12-MAY-23 20230512 2023 05 12 금
13-MAY-23 20230513 2023 05 13 토
14-MAY-23 20230514 2023 05 14 일
15-MAY-23 20230515 2023 05 15 월
16-MAY-23 20230516 2023 05 16 화
17-MAY-23 20230517 2023 05 17 수
18-MAY-23 20230518 2023 05 18 목
19-MAY-23 20230519 2023 05 19 금
20-MAY-23 20230520 2023 05 20 토
21-MAY-23 20230521 2023 05 21 일
22-MAY-23 20230522 2023 05 22 월
TRUNC(SYSDAT TO_CHAR(TRUNC(SY TO_CHAR( TO_C TO_C TO_CHAR(
------------ ---------------- -------- ---- ---- --------
23-MAY-23 20230523 2023 05 23 화
24-MAY-23 20230524 2023 05 24 수
25-MAY-23 20230525 2023 05 25 목
26-MAY-23 20230526 2023 05 26 금
27-MAY-23 20230527 2023 05 27 토
28-MAY-23 20230528 2023 05 28 일
29-MAY-23 20230529 2023 05 29 월
30-MAY-23 20230530 2023 05 30 화
31-MAY-23 20230531 2023 05 31 수
반응형
'데이터베이스 > ORACLE' 카테고리의 다른 글
[ORACLE/오라클] 딕셔너리 뷰를 이용해 테이블 명세서 작성 (0) | 2023.09.28 |
---|---|
[ORACLE/오라클] 딕셔너리 뷰를 이용해 SELECT문 만들기 (1) | 2023.05.14 |
[ORACLE/오라클] 유저 생성과 권한 (0) | 2023.05.01 |
[ORACLE/오라클] WINDOW 환경에서 SCOTT계정 생성 (0) | 2023.04.13 |
[ORACLE/오라클] 오라클 테이블 자동 DDL 생성 (테이블, PK, 인덱스) (0) | 2022.06.13 |