首页 > 解决方案 > Datepart 和 @@datefirst 的区别

问题描述

据我了解,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 是星期六?这是配置问题还是我的误解?

标签: sqlsql-servertsqldate

解决方案


基于以下Microsoft 文档

该函数返回一个字符串,表示指定日期的指定日期部分。

语法: DATENAME ( datepart , date )


更新 1

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

如果 date 参数的数据类型没有指定的 datepart,则 DATENAME 将仅在 date 参数具有 literal 时返回该 datepart 的默认值。

例如,任何日期数据类型的默认年-月-日都是 1900-01-01。此语句具有 datepart 的日期部分参数、日期的时间参数,并且 DATENAME 返回 1900, January, 1, 1, Monday

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

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

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

它返回

Monday

推荐阅读