오라클 달력과 관련해서...
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
HSODBC 를 이용하여 Oracle -> MSSQL 이기종 간에 DB Link (1) | 2012.09.26 |
---|---|
Oracle 사고친 유저 찾아보자 (0) | 2012.08.23 |
오라클 연단위 달력 쿼리 (0) | 2012.08.23 |
Oracle 랜덤 문자열 생성 (0) | 2012.08.23 |
ORA-02020: too many database links in use 에러 조치 방법 (0) | 2012.08.23 |