[Oracle] - 关于星期(IW和WW)的算法

1. 查看数据库字符集(如果字符集不同,可能显示乱码)

select DECODE(parameter,
              'NLS_TERRITORY',
              'TERRITORY',
              'NLS_LANGUAGE',
              'LANGUAGE',
              'NLS_CHARACTERSET',
              'CHARACTER SET') name,
       value
  from v$nls_parameters
 WHERE parameter IN ('NLS_TERRITORY', 'NLS_LANGUAGE', 'NLS_CHARACTERSET')

2.  查看数据库中指定日期为周几

create or replace function Get_weekday(pDate date) return number is
  vResult number;
begin
  select case to_char(pDate, 'FmDay', 'nls_date_language=english')
           when 'Monday' then
            1
           when 'Tuesday' then
            2
           when 'Wednesday' then
            3
           when 'Thursday' then
            4
           when 'Friday' then
            5
           when 'Saturday' then
            6
           when 'Sunday' then
            7
         end d
    into vResult
    from dual;
  return vResult;
end;

不推荐(根据NLS设置不同结果不同,例如周一为第一天和周日为第一天的Weekday结果不同) 

select sysdate Today,
       to_char(sysdate, 'D') Weekday,
       trunc(sysdate, 'DD') - to_char(sysdate, 'D') + 1 WeekFirstDay,
       trunc(sysdate, 'DD') - to_char(sysdate, 'D') + 7 WeekLastDay
  from dual;

 

3. 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

MoTuWeThFrSaSuISO Week
---1234First ISO week of 1998
567891011Second ISO week of 1998
12131415161718Third ISO week of 1998
19202122232425Fourth ISO week of 1998
262728293031-Fifth ISO week of 1998

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

MoTuWeThFrSaSuISO Week
----123Fifty-third ISO week of 1998
45678910First ISO week of 1999
11121314151617Second ISO week of 1999
18192021222324Third ISO week of 1999
25262728293031Fourth 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

参考资料

http://www.dw4e.com/?p=108
https://community.oracle.com/message/9511573#9511573

转载于:https://www.cnblogs.com/jinzesudawei/p/7910187.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值