Datepart和@@ datefirst的区别

时间:2019-01-14 22:13:16

标签: sql sql-server tsql date

据我了解,DateFirst是一周的第一天,或者是一周的第一天。但是,当我运行这些查询时,我的结果与我认为的理解不符

select @@datefirst,DATENAME(WEEKDAY,@@datefirst)
SELECT DATEPART(WEEKDAY,'20190113'),DATENAME(WEEKDAY,'20190113')
SELECT DATEPART(WEEKDAY,'20190114'),DATENAME(WEEKDAY,'20190114')
SELECT DATEPART(WEEKDAY,'20190115'),DATENAME(WEEKDAY,'20190115')
SELECT DATEPART(WEEKDAY,'20190116'),DATENAME(WEEKDAY,'20190116')
SELECT DATEPART(WEEKDAY,'20190117'),DATENAME(WEEKDAY,'20190117')
SELECT DATEPART(WEEKDAY,'20190118'),DATENAME(WEEKDAY,'20190118')
SELECT DATEPART(WEEKDAY,'20190119'),DATENAME(WEEKDAY,'20190119');

我明白了

7 Monday (this is the @@datefirst line)
1 Sunday
2 Monday
3 Tuesday
4 Wednesday
5 Thursday
6 Friday
7 Saturday

@@ datefirst如何给我7,一天给我星期一,而7是星期六?这是配置问题还是我的误解?

2 个答案:

答案 0 :(得分:3)

基于以下Microsoft Documentation

  

此函数返回代表指定日期的指定日期部分的字符串。

     

语法:DATENAME(datepart,date)


更新1

在同一篇文章的“部分”中:默认返回不在日期参数中的日期部分

  

如果date参数的数据类型没有指定的日期部分,则DATENAME仅在date参数具有文字的情况下才返回该日期部分的默认值。

     

例如,任何日期数据类型的默认年月日均为1900-01-01。该语句具有datepart的日期部分参数,date的时间参数,并且DATENAME返回1900年1月1日,星期一

因此,当您输入数字7时,输入将被视为1900-01-01 07:00:00并返回Monday

如果您转到SQL Server并运行以下命令

select DATENAME(WEEKDAY,'1900-01-01 07:00:00')

返回

Monday

答案 1 :(得分:0)

您对@@DATEFIRST的理解是正确的。

@@DATEFIRST是一个返回星期几的函数,其默认值取决于系统环境。

例如,如果您更改语言,则@@DATEFIRST默认值将根据该语言设置进行更改。 尽管@@DATEFIRST可以手动设置,而无需更改语言设置。

因此,在示例结果中,系统中将第7天(即星期日)定义为一周的第一天,但​​是,在日期函数(如DATENAME())中使用它时,会给您不正确的结果,因为@@DATEFIRST将返回一个整数(从1到7),而date函数采用DATE或DATETIME输入,而不是整数。这些,您使用@@DATEFIRST的方法效率不高。 @@DATEFIRST有多种用途,其中一种用途是获取正确的工作日。

让我们举一个简单的例子。我当前的@@DATEFIRST设置设为7,我想做一个标量函数,该函数始终为我提供下一个星期日的日期。因此,我可以使用它:

SELECT DATEADD(DW, @@datefirst - DATEPART(DW, GETDATE()) + 1 , GETDATE())

这将始终为我提供从今天起的下一个星期日。假设我的一位客户在另一个国家/地区的一周开始时间不同(比如说星期一= 1)。我不必更改上面的代码中的任何内容,只需要执行以下命令:

SET DATEFIRST 1

现在,这将为我的客户提供从当前日期开始的第一个星期一,而无需对我的实际查询进行进一步的自定义。

这只是一个简单的示例,可让您了解@@DATEFIRST

的用法

您可以检查这些参考文献以进一步了解它。

@@DATEFIRST (Transact-SQL)

SET DATEFIRST (Transact-SQL)