为什么 DATENAME(GETDATE()) 在今天是日期时给出与 DATENAME(2019-02-01) 不同的结果?

Why is DATENAME(GETDATE()) giving a different result as DATENAME(2019-02-01) when that is the date today?

我不明白为什么 DATENAME(GETDATE()) 给出的结果与 DATENAME(2019-02-01) 的结果不同,那是今天的日期

SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, 2019-02-01)

Returns:

2019-02-01 14:51:46.017 Friday  Monday<br>

虽然我希望它 return:

2019-02-01 14:51:46.017 Friday  Firday

请使用此datetime 应为字符串格式(日期格式)

 SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, '2019-02-01')

输出

2019-02-01 14:01:38.343          Friday          Friday

2个原因。首先,您使用的是值 2019-02-01;即表达式为“2019 minus 2 minus 1”;计算结果为 20162016 因为 datetime 是日期 '1905-07-10'(即 '1900-01-01' 之后的第 2,016 天)。如果您使用 '1905-07-10' 的函数 DATENAME 获得 WEEKDAY 的值,您将获得 'Monday'.

但是,如果您将值更改为字符串,因为您(可能)仍在使用 datetime,值 '2019-02-01' 将以 yyyy-dd-MM 格式解释,这意味着您得到值 'Wednesday' (SELECT DATENAME(WEEKDAY,CONVERT(datetime,'2019-02-01'));),这是 2019 年 1 月 2 日所在的工作日。

要获得正确的结果,请使用明确的文字字符串:

SELECT DATENAME(WEEKDAY,'20190201');

SQL 服务器中的非歧义日期(时间)格式(无论数据类型如何)是 yyyyMMddyyyy-MM-ddThh:mm:ss.ssss(格式 yyyy-MM-dd 是非歧义的 如果你没有使用datetime,请注意,如果你运行下面的SQL,datetime的值是不同的:)

SELECT CONVERT(date,'2019-02-01') AS [date],
       CONVERT(datetime,'2019-02-01') AS [datetime],
       CONVERT(datetime2(0),'2019-02-01') AS [datetime2],
       CONVERT(datetimeoffset,'2019-02-01') AS [datetimeoffset];

日期时间应该用单引号括起来!

检查:

DECLARE @date DATETIME = 2019-02-01
SELECT @date

您的初始查询(不带引号)涉及一个 "implied conversion",其中您的日期列正在转换为 varchar(使用该转换的服务器默认格式 [这被视为默认日期加上数字天数等于分配值的计算量。])