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

时间:2018-07-21 14:34:01

标签: sql sql-server tsql

如果我使用此查询:

devServer: {
            contentBase: path.join(__dirname, 'public'),
            publicPath: '/',
            historyApiFallback: true
        }

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

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

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

那里没有什么奇怪的。日期设置为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个隐式转换为日期并且是星期六的日期名称。哎呀,你在做什么:

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开始。它只是返回星期几的名称。