我不明白为什么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
原因。首先,您使用的是值 2019-02-01
;其表达式为"2019 减 2 减 1";其计算结果为 2016
. 2016
作为datetime
是'1905-07-10'
日期(即'1900-01-01'
后的第 2,016 天)。如果使用函数DATENAME
'1905-07-10'
获得 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 Server 中的非明确日期(时间)格式(无论数据类型如何)是yyyyMMdd
和yyyy-MM-ddThh:mm:ss.ssss
(如果不使用datetime
,则yyyy-MM-dd
格式为非歧义格式,请注意,如果运行以下 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];
请使用此datetime
应为字符串格式(日期格式)
SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, '2019-02-01')
输出
2019-02-01 14:01:38.343 Friday Friday
DateTime 应该用单引号传递!
检查:
DECLARE @date DATETIME = 2019-02-01
SELECT @date
您的初始查询(不带引号)涉及"隐含转换",其中您的日期列正在转换为 varchar(使用该转换的服务器默认格式 [即被视为默认日期加上等于分配值的计算量的天数。