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'), 0, 4) || '년 ' || SUBSTR(TO_CHAR(ADD_MONTHS(TODAY_DATE, -1), 'YYYYMMDD'), 5, 2) || '월 ' ELSE SUBSTR(TO_CHAR(TODAY_DATE, 'YYYY-MM-DD'), 0, 4) || '년 ' || SUBSTR(TO_CHAR(TODAY_DATE, 'YYYYMMDD'), 5, 2) || '월 ' 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 |