BackEnd/DBMS

Oracle :: 연 월 주차 쿼리

초록 (green) 2017. 12. 21. 00:25
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
-- "XXXX월 XX월 X째주"를 출력하는 쿼리.
-- 단, 이전달과 다음달이 이어지는 마지막 주의 경우, 평일 5일중 3일 이상이 속해있는 달로 치환되어야 하는 경우.
-- (ex. '2017-12-01' => 2017년 11월 5째주 / '2015-01-01' => 2014년 12월 5째주 로 출력되어야 함)
--
--
-- 무조건 평일 5일중 3일 이상이 속해있는 달로 치환되어야 하기 때문에, 어떤 날짜를 파라미터로 넣어도
-- 그 날짜가 속해있는 목요일의 날짜를 뽑도록 하여 기준을 잡았다.
-- => ㄱ) 해당 날짜가 속해있는 수요일의 날짜가 (DD가) 2보다 작을 때 (다음 달이 될 날짜들이 평일 5일중 3일 이상일 때)
--          다음 달의 첫번째 주차 (1주차)로 끼워넣음 
SELECT
    YYYYMM || JJA || '째주' AS WEEKLY_DT
FROM (SELECT
        CASE
            WHEN TO_CHAR(TODAY_DATE, 'DD'< 02
            THEN SUBSTR(TO_CHAR(ADD_MONTHS(TODAY_DATE, -1), 'YYYY-MM-DD'), 04|| '년 ' || SUBSTR(TO_CHAR(ADD_MONTHS(TODAY_DATE, -1), 'YYYYMMDD'), 52|| '월 '
            ELSE SUBSTR(TO_CHAR(TODAY_DATE, 'YYYY-MM-DD'), 04|| '년 ' || SUBSTR(TO_CHAR(TODAY_DATE, 'YYYYMMDD'), 52|| '월 '
        END AS YYYYMM,
        CASE
            WHEN TO_CHAR(TODAY_DATE, 'DD'< 02
            THEN TO_CHAR(TRUNC(TODAY_DATE -1'IW'), 'W')
            ELSE TO_CHAR(TODAY_DATE, 'W')
        END AS JJA
          -- 그 날짜가 속해있는 목요일의 날짜를 뽑는 쿼리
        FROM (SELECT
                TRUNC(TO_DATE(#params#, 'YYYY-MM-DD'), 'IW'+ LEVEL + 2 AS TODAY_DATE
            FROM
                DUAL
            CONNECT BY LEVEL <= 1
        ) WED_DAY
);
cs