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

Vin*_*gsn 4 sql-server date getdate datepart

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

SELECT GETDATE(), DATENAME(w, GETDATE()),DATENAME(dw, 2019-02-01)
Run Code Online (Sandbox Code Playgroud)

返回:

2019-02-01 14:51:46.017 Friday  Monday<br>
Run Code Online (Sandbox Code Playgroud)

虽然我希望它能回归:

2019-02-01 14:51:46.017 Friday  Firday
Run Code Online (Sandbox Code Playgroud)

Lar*_*rnu 7

2个原因.首先,你正在使用这个价值2019-02-01; 表达式是"2019减2减1"; 评估为2016.2016作为a datetime是日期'1905-07-10'(之后的第2,016天'1900-01-01').如果你得到的价值WEEKDAY使用功能DATENAME'1905-07-10''Monday'.

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

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

SELECT DATENAME(WEEKDAY,'20190201');
Run Code Online (Sandbox Code Playgroud)

SQL Server中的非模糊日期(时间)格式(无论数据类型)是yyyyMMddyyyy-MM-ddThh:mm:ss.ssss(如果您不使用,格式yyyy-MM-dd是非模糊的,请注意,如果您运行以下SQL,则值不同:)datetimedatetime

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];
Run Code Online (Sandbox Code Playgroud)