본문 바로가기
DataBase

오라클 연속된 날짜 레코드 생성하기( EXTRACT, LEVEL 활용법 )

by 맑은안개 2022. 1. 28.

CONNECT BY LEVELEXTRACT를 사용하여 현재 월의 모든 날짜 레코드를 생성한다.

EXTRACT

출처: 오라클

먼저 현재 월의 마지막 날짜의 DAY를 구한다.

SELECT EXTRACT(DAY FROM LAST_DAY(CURRENT_DATE)) AS END_OF_DAY FROM DUAL; 

END_OF_DAY|
----------+
        31|

CONNECT BY LEVEL

출처: 오라클

CONNECT BY LEVEL을 활용하여 연속된 레코드를 생성한다.

 SELECT LEVEL 
   FROM DUAL
CONNECT BY LEVEL <= EXTRACT(DAY FROM LAST_DAY(CURRENT_DATE));

LEVEL|
-----+
    1|
    2|
    3|
    4|
... 중략 ...
   28|
   29|
   30|
   31|

WHERE절에 LEVEL을 조건할 수 있다. 현재 날짜부터 말일까지 출력해보자.

 SELECT LEVEL 
   FROM DUAL
  WHERE LEVEL >= EXTRACT(DAY FROM CURRENT_DATE)
CONNECT BY LEVEL <= EXTRACT(DAY FROM LAST_DAY(CURRENT_DATE));

LEVEL|
-----+
   28|
   29|
   30|
   31|

YYYYMMDD 포맷으로 출력

EXTRACT함수는 날짜를 구성하는 모든 속성을 추출할 수 있다. 이를 사용하여 YYYYMMDD형태로 바꿔보자.

 SELECT EXTRACT(YEAR FROM CURRENT_DATE) || LPAD(EXTRACT(MONTH FROM CURRENT_DATE), 2, 0) || LPAD(LEVEL, 2, 0) AS ALL_DAYS
   FROM DUAL
CONNECT BY LEVEL <= EXTRACT(DAY FROM LAST_DAY(CURRENT_DATE));

ALL_DAYS|
--------+
20220101|
20220102|
20220103|
20220104|
...

각 날짜레코드의 요일 출력

TO_CHAR를 사용하여 요일을 출력해보자.

WITH TEMP AS (
     SELECT EXTRACT(YEAR FROM CURRENT_DATE) || LPAD(EXTRACT(MONTH FROM CURRENT_DATE), 2, 0) || LPAD(LEVEL, 2, 0) AS ALL_DAYS
       FROM DUAL
    CONNECT BY LEVEL <= EXTRACT(DAY FROM LAST_DAY(CURRENT_DATE))
)
SELECT ALL_DAYS
     , TO_CHAR(TO_DATE(ALL_DAYS), 'DAY') AS "DAY"
     , TO_CHAR(TO_DATE(ALL_DAYS), 'Dy') AS "Dy"
     , TO_CHAR(TO_DATE(ALL_DAYS), 'DY', 'NLS_DATE_LANGUAGE = ENGLISH') AS "DY"
  FROM TEMP;

ALL_DAYS|DAY|Dy|DY |
--------+---+--+---+
20220101|토요일|토 |SAT|
20220102|일요일|일 |SUN|
20220103|월요일|월 |MON|
20220104|화요일|화 |TUE|
...
반응형