DATEFIRST的影响力

来源:互联网 发布:西服颜色 知乎 编辑:程序博客网 时间:2024/05/16 00:31

DATEFIRST的影响力

 

DATEFIRST用来确定一周中第一天是星期几。可以通过SET DATEFIRST@@DATEFIRST来设置和返回其值:

一周的第一天是

1

星期一

2

星期二

3

星期三

4

星期四

5

星期五

6

星期六

7(默认值,美国英语)

星期日

 

DATEFIRST主要影响日期函数中涉及到星期的两个参数:WEEKWEEKDAY:前者通常表示指定日期是当年的第几个星期;后者通常表示指定日期是一周中第几天。

 

所有的日期函数中,只有DATEPART函数受DATEFIRST的影响,其它函数都不受其影响。下面来详细说说。

 

1.       DATEPART受其影响

DATEPART(WEEKDAY, @DT)返回指定日期是一周中的第几天,注意是相对于DATEFIRST为一周中第一天,这和是星期几不是一个概念。这也就是说,随着DATEFIRST设置不同,同一日期的上述返回值也不同。为了抵消这种影响,我们可以将@@DATEFIRST添加到@DT上,此时调用DATEPART与把DATEFIRST设为7的结果是一致的。如果你想把DATEFIRST逻辑地设置为n,从日期减去常数n即可:

DATEPART(WEEKDAY, @DT + @@DATEFRST  - n)

 

DATEPART(WEEK, @DT)返回指定日期是一年中第几个星期。用下面这种方法表述也许能更好理解这个函数:SQL Server总是将每年的11所在的WEEK的值总是1,其后每经过一个DATEFIRST就将值增加1

很多查询中要求按周分组,此时我们可以设置好DATEFIRST(因为中国人习惯是星期一是一周的第一天,而SQL SERVER缺省却是星期日是第一天),然后调用DATEPART(WEEK, @DT)分组就可以了。如果你想只是把DATEFIRST逻辑地设置为n,那可调用如下:

 DATEPART(WEEK, @DT + @@DATEFRST  - n)

 

2.       DATEDIFF不受影响

DATEDIFF(WEEKDAY, @DT1, @DT2)DATEDIFF(DAY, @DT1, @DT2)返回的结果一致。

DATEDIFF(WEEK, @DT1, @DT2)则和DATEFIRST7时的DATEPART(WEEK, @DT2) – DATEPART(WEEK, @DT1)一致。

 

3.       DATENAME不受影响

DATENAME(WEEKDAY, @DT)返回当前语言中,指定日期是星期几的字符串,比如下表分别为中(简体中文)英(us_english)文下的返回值(不包括引号):

简体中文

us_english

“星期一”

Monday

“星期二”

Tuesday

“星期三”

Wednesday

“星期四”

Thursday

“星期五”

Friday

“星期六”

Saturday

“星期日”

Sunday

 

DATENAME(WEEK, @DT)则返回的DATEFIRST7时的DATEPART(WEEK, @DT)的值。

 

4.       DATEADD不受影响

DATEADD(WEEKDAY, n, @DT)相当于DATEADD(DAY, n, @DT)

DATEADD(WEEK, n, @DT)相当于 DATEADD(DAY, n * 7, @DT)n个星期以后的日期是多少。

 

 

参考书籍:

1.《Microsoft SQL Server2005技术内幕:T-SQL程序设计》

 

原创粉丝点击