CONNECT BY LEVEL
과 EXTRACT
를 사용하여 현재 월의 모든 날짜 레코드를 생성한다.
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|
...
반응형
'DataBase' 카테고리의 다른 글
Oracle - sysdate timezone 목록 조회 및 변경 (0) | 2022.07.04 |
---|---|
오라클 날짜 계산 방법 예제 및 계산 시 유의할 점 (CURRENT_DATE VS SYSDATE ) (1) | 2022.01.29 |
MySql - Public Key Retrieval is not allowed 오류 해결 (0) | 2022.01.27 |
오라클 계층형 쿼리, 트리구조로 살펴보기(정렬, 최하위노드 찾기) (0) | 2022.01.26 |
오라클 replace 여러개(문자) 치환하기( regexp_replace 사용 ) (0) | 2022.01.25 |