🐱🐉 개요
날짜가 주어지면 이를 휴일인지 아닌지 구분해야 하는 문제를 겪었다.
공휴일은 보통 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 명령어가 올바르게 종료되지 않았습니다.
위 오류 같은 경우에는 예상 원인이 무궁무진하다.
오타, 띄어쓰기, 콤마 등의 오류부터 필요한 키워드가 빠져있다던가, 괄호 수가 맞지 않다던가 다양하다.
'Develop > CS' 카테고리의 다른 글
브라우저의 동작 원리 (0) | 2021.10.07 |
---|---|
페이스북이 멈췄다? (DNS와 BGP에 대해) (0) | 2021.10.05 |
[Oracle] ORA-01476: 제수가 0 입니다. (0) | 2021.08.09 |
[Mybatis] ResultMap 이용하기 (6) | 2021.08.02 |
[Oracle] 인덱스에서 누락된 IN 또는 OUT 매개변수:: (2) | 2021.08.02 |