为什么 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”;计算结果为 2016
。 2016
因为 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 服务器中的非歧义日期(时间)格式(无论数据类型如何)是 yyyyMMdd
和 yyyy-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(使用该转换的服务器默认格式 [这被视为默认日期加上数字天数等于分配值的计算量。])
我不明白为什么 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”;计算结果为 2016
。 2016
因为 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 服务器中的非歧义日期(时间)格式(无论数据类型如何)是 yyyyMMdd
和 yyyy-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(使用该转换的服务器默认格式 [这被视为默认日期加上数字天数等于分配值的计算量。])