为什么DATENAME(GETDATE())给出的结果与DATENAME(2019-02-01)不同?

时间:2019-02-01 14:00:05

标签: sql-server date getdate datepart

我不明白为什么DATENAME(GETDATE())给出的结果与DATENAME(2019-02-01)的结果不同

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

返回:

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

虽然我希望它返回:

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

3 个答案:

答案 0 :(得分:6)

2个原因。首先,您使用的值2019-02-01;表示为“ 2019减去2减去1”;该计算结果为20162016作为datetime是日期'1905-07-10'(这是第二千零十六一天后'1900-01-01')。如果得到的值WEEKDAY使用函数DATENAME的{​​{1}}你得到'1905-07-10'

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

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

SELECT DATENAME(WEEKDAY,CONVERT(datetime,'2019-02-01'));

SQL Server中的日期(时间)格式(无论数据类型如何)都是明确的SELECT DATENAME(WEEKDAY,'20190201'); yyyyMMdd(格式yyyy-MM-ddThh:mm:ss.ssss是明确的 if 不使用yyyy-MM-dd,请注意,如果运行以下SQL,对于值datetime是不同的:)

datetime

答案 1 :(得分:2)

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

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

输出

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

答案 2 :(得分:2)

DateTime应该用单引号引起来!

检查:

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

您的初始查询(不带引号)涉及一个“隐含转换”,其中您的日期列正在转换为varchar(使用服务器默认格式进行该转换[即被视为默认日期加上相等的天数到分配值的计算量。])