Oracle關於week的計算問題

ljm0211發表於2012-06-20

問題如下:

使用如下兩句SQL查詢,結果分別為35和36,而事實上這兩天在同一周

select TO_CHAR (TO_DATE ('20080901', 'yyyyMMdd'), 'ww') as Week from dual;
select TO_CHAR (TO_DATE ('20080902', 'yyyyMMdd'), 'ww') as Week from dual;

原因:

Oracle對周的計算很原始,直接計算今天距離1/1有幾天,然後除以7得到周。

修改方式:

我和kevin寫了個函式,手工推算周,可以解決這個問題

CREATE OR REPLACE
FUNCTION getnaturalweek (
   date_   IN   VARCHAR2 DEFAULT TO_CHAR (SYSDATE, 'YYYYMMDD')
)
   RETURN VARCHAR2
IS
   add_days      NUMBER (8, 0);
   total_days    NUMBER (8, 0);
   total_weeks   NUMBER (8, 0);
   weeks         VARCHAR2 (2);
BEGIN
   add_days :=
        TO_NUMBER (TO_CHAR (TRUNC (TO_DATE (date_, 'YYYYMMDD'), 'YYYY'), 'D'))
      - 1;
   total_days :=
            TO_NUMBER (TO_CHAR (TO_DATE (date_, 'YYYYMMDD'), 'ddd'))
            + add_days;
   total_weeks := CEIL (total_days / 7);
   weeks := TO_CHAR (total_weeks);

   IF LENGTH (weeks) <= 1
   THEN
      weeks := '0' || weeks;
   END IF;

   RETURN weeks;
END;
/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/11411056/viewspace-733352/,如需轉載,請註明出處,否則將追究法律責任。

相關文章