해당 월에 날짜를구해보는 쿼리에서 궁금한부분이있습니다. 0 2 2,214

by 이묵 [SQL Query] [2013.11.25 13:11:18]


SELECT MAX(DECODE(D, 1, LPAD(DD, 2, '00')))DAYS1,
   MAX(DECODE(D, 2, LPAD(DD, 2, '00')))DAYS2,
   MAX(DECODE(D, 3, LPAD(DD, 2, '00')))DAYS3,
   MAX(DECODE(D, 4, LPAD(DD, 2, '00')))DAYS4,
   MAX(DECODE(D, 5, LPAD(DD, 2, '00')))DAYS5,
   MAX(DECODE(D, 6, LPAD(DD, 2, '00')))DAYS6,
   MAX(DECODE(D, 7, LPAD(DD, 2, '00')))DAYS7
  FROM (SELECT ROWNUM DD,
   TO_CHAR(TO_DATE(&as_day||LPAD(ROWNUM, 2, '00')), 'D') D,
   TO_CHAR(TO_DATE(&as_day||LPAD(ROWNUM, 2, '00')), 'IW') W
  FROM DUAL
  CONNECT BY LEVEL <= TO_CHAR(LAST_DAY(TO_DATE(&as_day, 'YYYYMM')), 'DD') )
 GROUP BY W
 ORDER BY 1 NULLS FIRST

년/월을 입력받아 해당하는 달에 날짜를 구하는 쿼리를 짜봤습니다. ((검색엔진도움을받으며....))

여기서 해당하는날짜가 몇번째주인지 구하는

TO_CHAR(TO_DATE(&as_day||LPAD(ROWNUM, 2, '00')), 'IW') 이부분에서

2014년 8월이라고 가정했을때 8월달은 총6주여야되는데 5주로표시됩니다.

그래서 TO_CHAR(TO_DATE(&as_day||LPAD(ROWNUM, 2, '00')), 'IW')+1 이렇게 +1을해주니

달력상과같이 재대로 6주가표시되더군요  왜그런지 이유를모르겠습니다


그리고 IW,WW랑 어떤차이가있는지 정확히 이해가안되네요ㅠ
by 마농 [2013.11.25 13:33:26]
-- 'D' 일주일(일요일~토요일)을 숫자로 표시
-- 'IW' 년 주차 표시(월요일~일요일, 1월1일이 월요일~목요일 사이이면 1주차, 아니면 전년도 마지막 주차)
-- 'WW' 년 주차 표시(1주차 : 1월1일 ~1월7일)
-- 'W' 월 주차 표시(1주차 : 매월1일 ~매월7일)
-- 작성하신 쿼리를 보시면 
-- 구룹바이 기준은 'IW'로 하면서, 요일 기준은 'D' 를 사용하셨네요.
-- 둘다 'D'를 사용하도록 하세요.
SELECT MIN(DECODE(d, '1', dd)) sun
     , MIN(DECODE(d, '2', dd)) mon
     , MIN(DECODE(d, '3', dd)) tue
     , MIN(DECODE(d, '4', dd)) wed
     , MIN(DECODE(d, '5', dd)) thu
     , MIN(DECODE(d, '6', dd)) fri
     , MIN(DECODE(d, '7', dd)) sat
  FROM (SELECT dt + LEVEL - 1 dt
             , TO_CHAR(dt + LEVEL - 1, 'dd') dd
             , TO_CHAR(dt + LEVEL - 1, 'd' ) d
             , TRUNC  (dt + LEVEL - 1, 'd' ) w
          FROM (SELECT TO_DATE(&as_day, 'yyyymm') dt FROM dual)
         CONNECT BY LEVEL <= LAST_DAY(dt) - dt + 1
        )
 GROUP BY w
 ORDER BY w
;

by 이묵 [2013.11.26 10:48:50]

와우 이런방법도있었네요
좋은 답변감사합니다 마농님~!

댓글등록
SQL문을 포맷에 맞게(깔끔하게) 등록하려면 code() 버튼을 클릭하여 작성 하시면 됩니다.
로그인 사용자만 댓글을 작성 할 수 있습니다. 로그인, 회원가입