据我了解,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是星期六?这是配置问题还是我的误解?
答案 0 :(得分:3)
此函数返回代表指定日期的指定日期部分的字符串。
语法:DATENAME(datepart,date)
在同一篇文章的“部分”中:默认返回不在日期参数中的日期部分
如果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
您可以检查这些参考文献以进一步了解它。