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