본문 바로가기
Develop/CS

[Oracle] SQL문으로 주말 구하기

by 연로그 2021. 8. 30.
반응형

🐱‍🐉 개요

날짜가 주어지면 이를 휴일인지 아닌지 구분해야 하는 문제를 겪었다.

공휴일은 보통 DB에 테이블을 따로 만들어서 관리하지만 주말은 굳이 그럴 필요 없이 SQL문으로 해결 가능하다.

 

 

🐱‍👤 주말 구하기

포인트는 주어진 날짜의 '요일'을 구하는 것이다.

해당 날짜의 요일을 구한 뒤, 토요일과 일요일인 경우만 조회하면 주말을 조회할 수 있다.

 

Step 1

SELECT TO_CHAR(SYSDATE,'D')
FROM DUAL;

 

Step 1-1

: 날짜가 문자열 형태로 주어지는 경우

SELECT TO_CHAR(TO_DATE(:SEARCH_DATE),'D')
FROM DUAL;

 

Step 2

step 1의 쿼리문을 실행시키면 일요일부터 토요일까지 1 ... 7의 결과를 구할 수 있다.

이제 IN을 이용해 일요일, 토요일만 조회해본다.

SELECT CASE WHEN TO_CHAR(SYSDATE,'D') IN ('1','7')
            THEN '주말'
            ELSE '평일' END AS WEEK_DAY
FROM DUAL;

만약 TO_CHAR(SYSDATE,'D')가 1, 7이라면 '주말',

1, 7이 아니라면 '평일'을 출력하게 된다.

 

Step 3

: 특정 기간의 주말 구하기

WITH DT_W AS (
    SELECT /*+ MATERIALIZE */ TO_CHAR(TO_DATE(ST_DT, 'YYYYMMDD') + LEVEL - 1, 'YYYYMMDD') AS DT
    FROM ( SELECT '20210801' AS ST_DT,'20210830' AS END_DT
           FROM DUAL )
    CONNECT BY LEVEL <=  TO_DATE(END_DT, 'YYYYMMDD') - TO_DATE(ST_DT, 'YYYYMMDD') + 1
)
SELECT CASE WHEN TO_CHAR(TO_DATE(D.DT),'D') IN ('1','7')
            THEN '주말'
            ELSE '평일' END AS WEEK_DAY
FROM DT_W D;

2021.08.01 ~ 2021.08.30 사이의 날짜가 주말인지, 평일인지 구하는 쿼리문이다.

굳이 WITH 절을 사용하지 않아도 되지만 날짜 조회를 자주 하다보니 복붙하기 편하려고 분리해놨다..

(사용이 편리하지만 경우에 따라 성능 이슈가 있을 수 있으니 유의)

WITH절을 몰라서 잘 이해가 되지 않는다 싶으면 아래 쿼리문을 참고하길 바란다.

 

Step 3-1

SELECT CASE WHEN TO_CHAR(TO_DATE(DT),'D') IN ('1','7')
            THEN '주말'
            ELSE '평일' END AS WEEK_DAY
FROM (
    SELECT /*+ MATERIALIZE */ TO_CHAR(TO_DATE(ST_DT, 'YYYYMMDD') + LEVEL - 1, 'YYYYMMDD') AS DT
    FROM ( SELECT '20210801' AS ST_DT,'20210830' AS END_DT
           FROM DUAL )
    CONNECT BY LEVEL <=  TO_DATE(END_DT, 'YYYYMMDD') - TO_DATE(ST_DT, 'YYYYMMDD') + 1
);

 

 

🐱‍💻 실행 오류

01) ORA-01839: 지정된 월에 대한 날짜가 부적합합니다.

조회하려는 날짜를 잘 살펴보자.

나같은 경우, 올해 2월은 며칠까지 있었는지 기억이 안나서 20210230 식으로 조회했다가 나타났던 오류다.

유효한 날짜를 조회해야 해당 오류가 나타나지 않는다.

 

02) ORA-00933: SQL 명령어가 올바르게 종료되지 않았습니다.

위 오류 같은 경우에는 예상 원인이 무궁무진하다.

오타, 띄어쓰기, 콤마 등의 오류부터 필요한 키워드가 빠져있다던가, 괄호 수가 맞지 않다던가 다양하다.

반응형