상세 컨텐츠

본문 제목

오라클 달력과 관련해서...

DataBase/Oracle

by 탑~! 2012. 8. 23. 14:40

본문

오라클 달력과 관련해서...

WITH T AS (

SELECT TO_DATE( DAYS, 'YYYYMMDD' ) AS DATES

     , WEEKDAY

     , WEEKCNT

     , SUM( DECODE( TMP, '7', 1, 0 ) ) OVER ( ORDER BY DAYS ) + 1 AS YEARWEEKCNT

  FROM ( SELECT TO_CHAR( MONTHS, 'YYYYMM' ) AS MONTHS

              , TO_CHAR( MONTHS, 'YYYYMM' )||LPAD( LV, 2, '0' ) AS DAYS

              , TO_CHAR( MONTHS + ( LV - 1 ), 'D' ) AS WEEKDAY

              , LAG( TO_CHAR( MONTHS + ( LV - 1 ), 'D' ) ) OVER ( ORDER BY DAYCNT ) AS TMP

              , DAYCNT

              , ( LV

                + ( 7 - TO_CHAR( MONTHS + ( LV - 1 ), 'D' ) )

                + ( TO_CHAR( TO_DATE( TO_CHAR( MONTHS, 'YYYYMM' )||'01', 'YYYYMMDD' ), 'D' ) - 1 ) ) / 7 AS WEEKCNT

           FROM ( SELECT ADD_MONTHS( TO_DATE( SUBSTR( :as_yyyycnt, 1, 4 ), 'YYYY"0101"' ), LV - 1 ) AS MONTHS

                       , TO_CHAR( LAST_DAY( ADD_MONTHS( TO_DATE( SUBSTR( :as_yyyycnt, 1, 4 ), 'YYYY"0101"' ), LV - 1 ) ), 'DD' ) AS DAYCNT

                    FROM DUAL SA

                       , ( SELECT LEVEL LV

                             FROM DUAL

                          CONNECT BY LEVEL <= 12 ) ) A

              , ( SELECT LEVEL LV

                    FROM DUAL 

                 CONNECT BY LEVEL <= 31 ) B ) M

 WHERE MONTHS||DAYCNT >= DAYS

 ORDER BY MONTHS, DAYS

)

SELECT *

  FROM T



======================================================================



주차 관련해서 만든 쿼리인데... 수정할게 아직 몇개 더 있다.

현재 ISO 기준으로는 분명 월요일이 주의 시작이다. 그러므로 현재 쿼리가 맞다고 할 수 있다.

그런데 가끔 보면 달력에 일요일이 앞에 있다고 자꾸 일요일이 시작이라는 사람들이 잇는데...

뭐 업무상 그렇다면 뭐라하겠는가... 단지 ISO 국제 기준으로는 월요일이 시작이다.

그리고 ISO기준상 주의 시작과 끝의 각 월이 만나는 부분의 주당 주차수를 계산할때는 그 한주에 차지하는 전월과 현재월의 비중... 그러니까 어느달의 날짜가 주중에 더 많은가로 귀속 월을 정한다고 한다.

그게 반영되어 있지 않은거지...

그래서 이걸 주의 시작을 옵션으로 일요일과 월요일을 선택가능하게 하고, 월 주차 계산시 ISO 표준에 맞도록 해당주의 날짜중 어느달의 날자가 많은지를 봐서 귀속주차를 정할수 있도록 만들면 달력 쿼리의 최종본이 될거 같다.

음력은 여전히 테이블을 만들어서 부어야 하겠지만... 더이상 양력을 테이블 만들어서 사용하지 말자. 저 쿼리 cpu 많이먹지도 않고 오래걸리지도 않는다.

달력 날짜 입력해놓은걸 다 썼다고 프로그램 오류나는 시대는 이제 끝나야하지 않겠는가?



출처 : http://bliseer.blogspot.kr/2011/01/blog-post.html

관련글 더보기