Oracle中关于星期(IW和WW)的算法

Oracle中对于星期的计算规则中,其中关于计算本周是一年的第几周,有两种格式,IW和WW,其中的区别官方文档解释如下:

  • IW:基于 ISO标准计算出来的该年的第几周(1-52 or 1-53) 。
  • WW:该年的第几周(1-53),其中第1周指该年的第1天至第7天。
  • 从文档中可以看出,WW的算法是: int(dayOfYear+6)/7,个人觉得这种算法有点“2”。相信一般情况下,我们不会使用WW的吧,应该IW使用的比较多。
    关于Oracle提到的这个星期的计算ISO标准,是这样的:

  • 每个星期总是从周一开始,周日结束。
  • 如果1月1日是周五、周六或周日,则这一周算为上一年的最后一周,因为这周的大部分时间属于上一年。
  • 如果1月1日是周一、周二、周三或周四,则这一周算为新年的第一周,因为这周的大部分时间属于新的一年。
  • 下面这两张表格,是从Oracle官方文档中截取出来的:

    Table 3-7 First ISO Week of the Year: Example 1, January 1998

    Mo Tu We Th Fr Sa Su ISO Week
    - - - 1 2 3 4 First ISO week of 1998
    5 6 7 8 9 10 11 Second ISO week of 1998
    12 13 14 15 16 17 18 Third ISO week of 1998
    19 20 21 22 23 24 25 Fourth ISO week of 1998
    26 27 28 29 30 31 - Fifth ISO week of 1998

    Table 3-8 First ISO Week of the Year: Example 2, January 1999

    Mo Tu We Th Fr Sa Su ISO Week
    - - - - 1 2 3 Fifty-third ISO week of 1998
    4 5 6 7 8 9 10 First ISO week of 1999
    11 12 13 14 15 16 17 Second ISO week of 1999
    18 19 20 21 22 23 24 Third ISO week of 1999
    25 26 27 28 29 30 31 Fourth ISO week of 1999

    从表中可以看出,按照ISO标准算法,同样是1月1日,1998年是算第一周,而1999年的1月1日却算为上一年的最后一周。

    这里需要注意的是,ISO标准中星期的第一天是周一,而Oracle中其他一些日期处理算法中(如D),默认每周的第一天是周日。因为第一天是周日还是周一,由参数NLS_TERRITORY决定,而该参数的默认值是从NLS_LANG继承过来的,NLS_LANG默认值为AMERICA,因此默认周日是每周的第一天)。
    我们很多人认为中国人每周第一天从周一开始,其实不是这样哦,从Oracle上可以看出来,其实我国的每周第一天仍然是周日,与美国一致,只有德国、法国等一些欧洲国家是从周一开始的:

    SQL> select to_char(sysdate,’yyyymmdd’) from dual;

    TO_CHAR(
    ——–
    20110901

    SQL> ALTER SESSION SET NLS_TERRITORY=AMERICA;

    Session altered.

    SQL> select to_char(sysdate,’d') from dual;

    T
    -
    5

    SQL> ALTER SESSION SET NLS_TERRITORY=China;

    Session altered.

    SQL> select to_char(sysdate,’d') from dual;

    T
    -
    5

    SQL> ALTER SESSION SET NLS_TERRITORY=GERMANY;

    Session altered.

    SQL> select to_char(sysdate,’d') from dual;

    T
    -
    4


    Data Warehouse For Ever原创文章,转载请注明出处

    Leave a Comment


    NOTE - You can use these HTML tags and attributes:
    <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>