반응형
만든배경
언젠가의 일이다.
프로그램안에서 달력을 클릭하면 달력의 모양을 보여주고 해당 달력의 일자별로 아래 내용을 넣어야 했다.
java에서 해결해도 되지만, 귀찮게 손이 많이 갈 것 같았다.
그냥 쿼리로 만들어 필요한 테이블하고 조인걸어서 그냥 뿌리고 편하게 작업하고 싶었다.
그때 만들어두었던 쿼리다.
(사실.. 별거 없음 ^^;;;;;)
만년 달력 쿼리 - 이번달 + 날짜지정(특정일자)
-- 만년 달력 쿼리 - 이번달 + 날짜지정(특정일자) - 오라클(Oracle) 쿼리(Query)
SELECT MAX(DECODE(WEEK_NO, '1', DAYS, ' ')) AS "일"
, MAX(DECODE(WEEK_NO, '2', DAYS, ' ')) AS "월"
, MAX(DECODE(WEEK_NO, '3', DAYS, ' ')) AS "화"
, MAX(DECODE(WEEK_NO, '4', DAYS, ' ')) AS "수"
, MAX(DECODE(WEEK_NO, '5', DAYS, ' ')) AS "목"
, MAX(DECODE(WEEK_NO, '6', DAYS, ' ')) AS "금"
, MAX(DECODE(WEEK_NO, '7', DAYS, ' ')) AS "토"
FROM (
SELECT TO_NUMBER(TO_CHAR(STD_DAY + LEVEL - 1 + 1, 'IW')) AS WEEK_CNT -- 00주차 (일요일부터 시작하도록 +1하여 계산)
, TO_CHAR(STD_DAY + LEVEL - 1, 'D') AS WEEK_NO -- 요일(숫자 - 1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토)
, TO_CHAR(STD_DAY + LEVEL - 1, 'DD') AS DAYS -- 일자
FROM (
SELECT TRUNC(SYSDATE, 'MM') AS STD_DAY FROM DUAL -- 이번달로 계산할때
-- SELECT TRUNC(TO_DATE('2022-01-10', 'YYYY-MM-DD'), 'MM') AS STD_DAY FROM DUAL -- 특정일자의 월로 계산할때
)
CONNECT
BY STD_DAY + LEVEL - 1 <= TRUNC(LAST_DAY(STD_DAY))
)
GROUP
BY WEEK_CNT
ORDER
BY WEEK_CNT
;
쿼리결과
쿼리 설명
STD_DAY를 기준일로 해당월의 1일부터 말일까지 일자를 생성하고, 이때 주차수와 요일(번호)를 같이 생성한다.
이후 GROUP BY 할때 주차수로 해서, 1주~마지막주까지 행을 만들면서 각 요일별로 일자를 뿌려준다.
끝.
반응형
'DataBase > Oracle' 카테고리의 다른 글
[Oracle] 문자열에서 콤마(,) 단위로 행(row)으로 분리하는 쿼리 (콤마별 행분리) (68) | 2023.02.06 |
---|---|
Oracle] 전화번호 형식으로 변환하는 쿼리 (하이픈 넣어주는 쿼리) (36) | 2022.12.30 |
Oracle] 숫자 데이터만 추출하기 (21) | 2022.12.29 |
[Oracle] 근속년수 조회 - 년수 / 개월수 / 일수 계산 쿼리 (10) | 2022.12.29 |
[Oracle] 로또쿼리 - 로또 번호 생성(추출) 쿼리 (2) | 2022.12.29 |