我不明白为什么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
答案 0 :(得分:6)
2个原因。首先,您使用的值2019-02-01
;表示为“ 2019减去2减去1”;该计算结果为2016
。 2016
作为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(使用服务器默认格式进行该转换[即被视为默认日期加上相等的天数到分配值的计算量。])