Etc/DB

[ DB Oracle ] 간단 Calender Query

foobarbaz 2019. 5. 21. 13:23

SELECT 
  WEEKS, 
  SUM(DECODE(D,'1', DAYNUM)) AS SUN, 
  SUM(DECODE(D,'2', DAYNUM)) AS MON, 
  SUM(DECODE(D,'3', DAYNUM)) AS TUE, 
  SUM(DECODE(D,'4', DAYNUM)) AS WED, 
  SUM(DECODE(D,'5', DAYNUM)) AS THU, 
  SUM(DECODE(D,'6', DAYNUM)) AS FRI, 
  SUM(DECODE(D,'7', DAYNUM)) AS SAT 
    FROM ( 
      SELECT 
        ROWNUM AS DAYNUM, 
        TO_CHAR(TO_DATE(B.YYMM||LPAD(ROWNUM,2,'0'),'YYYYMMDD'), 'D') AS D, 
        CAST(TO_CHAR(TO_DATE(B.YYMM||LPAD(ROWNUM,2,'0'),'YYYYMMDD'), 'W') AS NUMBER) + 
        DECODE( 
            SIGN(CAST(TO_CHAR(TO_DATE(B.YYMM||LPAD(ROWNUM,2,'0'),'YYYYMMDD'), 'D') AS NUMBER) 
            -CAST(TO_CHAR(TO_DATE(B.YYMM||'01','YYYYMMDD'), 'D') AS NUMBER)), 
            0, -1, 1, -1, 0)  +1  AS WEEKS 
      FROM DUAL CROSS JOIN (SELECT '201905' AS YYMM FROM DUAL) B 
      CONNECT BY LEVEL<=TO_NUMBER(TO_CHAR(LAST_DAY(TO_DATE(B.YYMM,'YYYYMM')),'DD')) 
    ) 
GROUP BY WEEKS
ORDER BY WEEKS;