天天看點

oracle iw,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