데이터베이스/ORACLE

[ORACLE/오라클] 날짜 테이블, 달력 테이블 만들기

또 뭘 잘못 코딩했을까 2023. 5. 5. 18:08
반응형

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   수
반응형