繁体   English   中英

使用SQL Server进行日期转换(DATENAME,DATEPART)的结果很奇怪

[英]Weird results of date conversion (DATENAME,DATEPART) using SQL Server

如果我使用此查询:

SET DATEFORMAT dmy;
SELECT DATEPART(dw,CAST('02-08-2018' AS date)) AS day

当02-08-2018是星期四时,我将得到结果5。

DATENAME星期中甚至更奇怪的东西都从0开始,所以0是星期一,如果我使用这样的话:

SET DATEFORMAT dmy;
    SELECT DATENAME(dw,DATEPART(dw,CAST('02-08-2018' AS date))) AS day

我会得到星期六,但是如果我只是在预定日期使用DATENAME:

SET DATEFORMAT dmy;
    SELECT DATENAME(dw,CAST('02-08-2018' AS date)) AS day

我会得到星期四的正确结果。

我的问题是:特别是在第一个给我5的查询中,发生了什么? 如果DATENAME(dw,...)从0开始,也是DATEPART(dw,...)从0开始吗?

那里没有什么奇怪的。 日期设置为DMY,您的'02 -08-2018'表示2018年8月2日,即星期四。 同样,工作日从星期日开始,因此它给工作日5。

在第二个查询中:

SET DATEFORMAT dmy;
SELECT DATENAME(dw,DATEPART(dw,CAST('02-08-2018' AS date))) AS day

您不是在检查2018年8月2日的日期名称,而是检查5个隐式转换为日期且为星期六的日期名称。 IOW,您正在执行以下操作:

SELECT datename(dw,DATEADD(d,5,CAST('00010101' AS DATE)))

可能是奇怪且未记录的文件,但这就是SQL Server的行为方式。

当您投射日期时,您将获得预期的星期四。

无论如何,SQL Server在基于语言和设置将字符串转换为date \\ datetime时也存在问题,不依赖于语言和设置并将日期指定为“ yyyyMMdd”更为可靠。 即:

SELECT DATEPART(dw,CAST('20180802' AS date)) AS day

编辑:BTW datename(dw,...)没有像从0或1开始的东西。它只返回星期几的名称。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM