무회blog

ORACLE 월요일기준 연주차, 요일, 분기 계산 본문

DB

ORACLE 월요일기준 연주차, 요일, 분기 계산

최무회 2022. 12. 29. 21:47
-- 주차에 속한 일주일 구하기 
SELECT '20220101',
    TO_CHAR( TO_DATE('20220101','YYYYMMDD') ,'YYYY-IW') AS YW    
  , TO_CHAR( TO_DATE('20220101','YYYYMMDD') +( 1 -     TO_CHAR(TO_DATE('20220101','YYYYMMDD') - 1, 'D') ), 'YYYY-MM-DD') AS START_DATE
  , TO_CHAR( TO_DATE('20220101','YYYYMMDD') +( 1 + 6 - TO_CHAR(TO_DATE('20220101','YYYYMMDD') - 1, 'D') ), 'YYYY-MM-DD') AS END_DATE
FROM DUAL;

SELECT TO_CHAR( TO_DATE('20220101','YYYYMMDD') ,'YYYY-IW') AS YW    FROM DUAL;
SELECT TO_CHAR( TO_DATE('20220101', 'RRRR-MM-DD'), 'iw' ) FROM DUAL
;
WITH ASD AS ( 
SELECT 
   TO_DATE('20221229', 'YYYYMMDD')                              AS 기준일
,  TRUNC(TO_DATE('20221229', 'YYYYMMDD'), 'YY' )                AS 기준일_연초기화
,  TRUNC(TO_DATE('20221229', 'YYYYMMDD'), 'MM' )                AS 기준일_월초기화
,  TO_CHAR(TRUNC(TO_DATE('20221229', 'YYYYMMDD') ) , 'WW' )     AS 일요일기준_연주차
,  TO_CHAR(TRUNC(TO_DATE('20221229', 'YYYYMMDD') ) , 'IW' )     AS 월요일기준_연주차
,  LEVEL                                                               AS NO
,  TO_CHAR(TRUNC(TO_DATE('20220101', 'YYYYMMDD'), 'YY' )  + LEVEL-1, 'YYYY')                 AS NEW_연
,  TO_CHAR(TRUNC(TO_DATE('20220101', 'YYYYMMDD'), 'YY' )  + LEVEL-1, 'YYYY-MM')              AS NEW_월
,  TO_CHAR(TRUNC(TO_DATE('20220101', 'YYYYMMDD'), 'YY' )  + LEVEL-1, 'YYYYMMDD')             AS NEW_일
,  TO_DATE(TO_CHAR(TRUNC(TO_DATE('20220101', 'YYYYMMDD'), 'YY' )  + LEVEL-1, 'YYYYMMDD'))             AS NEW_일_TODATE
,  TO_CHAR(
   TO_DATE(TO_CHAR(TRUNC(TO_DATE('20220101', 'YYYYMMDD'), 'YY' )  + LEVEL-1, 'YYYYMMDD') )           -- NEW_DAY
   , 'DY')                                                                                        AS NEW_요일
   
,  TO_CHAR(
   TO_DATE(TO_CHAR(TRUNC(TO_DATE('20220101', 'YYYYMMDD'), 'YY' )  + LEVEL-1, 'YYYYMMDD') )           -- NEW_DAY
   , 'D')                                                                                        AS NEW_요일_숫자   --결과 : 3 (1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토) 

FROM DUAL 
WHERE 1=1 CONNECT BY LEVEL <= 365*5
)
SELECT 
'A' AS A
, NO
, NEW_연
, NEW_월
, NEW_일
,  TO_CHAR(TRUNC(TO_DATE(NEW_일   , 'YYYYMMDD') ) , 'IW' )  AS NEW_연주차 -- 월요일기준
,  TO_CHAR(NEW_일_TODATE,'W') AS NEW_월주차
, TO_CHAR(NEW_일_TODATE, 'Q')   AS 분기
, TO_CHAR(NEW_일_TODATE, 'Q')||'/4'   AS 분기점
, CASE WHEN TO_CHAR(NEW_일_TODATE, 'Q') < 3 THEN '상반기' ELSE '후반기' END AS 상반기여부
,  NEW_요일
-- , NEW_요일_숫자                     --결과 : 3 (1:일, 2:월, 3:화, 4:수, 5:목, 6:금, 7:토) 토일 71 
, CASE WHEN NEW_요일_숫자 IN (7,1) THEN '1' ELSE '0' END AS 주말여부     -- 주말 :1 , 평일 : 0 
FROM ASD
;
------------------------------------------------------------------------------------------
Comments