T-SQL 以整数值作为日期参数的日期函数

T-SQL Date function with Integer values as date parameter

我在尝试修改遗留查询时遇到了这个代码块

select   DATEADD(MONTH, DATEDIFF(MONTH, -1,getdate() )-1, 1)

但我认为 dateadd 和 datediff 函数需要一些日期参数来进行计算。但是这里 DateDiff 和 DateAdd 在 Date 参数

的地方有一些整数值

例如 DATEDIFF(MONTH, -1,getdate() )-1 returns 1431 这只是一个十进制值,但根据文档的代码块查找 Date 参数。

https://www.w3schools.com/sql/func_sqlserver_datediff.asp

DateAdd 也一样

有人请分享一些解释

不幸的是,DATEADDDATEDIFF 被指定用于 datetime(以及任何较新的日期时间数据类型)。因此,它们继承了旧类型的许多肮脏之处,包括 implicit conversionsintdatetime 是允许的1.

0 转换为 1900-01-01-1 转换为 1899-12-311 转换为 1900-01-02。简而言之,整数转换为1900-01-01之后的第"that many"天。

但是让我们看看您的代码。它计算 个月 1899-12-31 的差异,然后减去一个,将相同的月数加到 1900-01-02 上。这样做的最终效果是给你当前月份的第 2 个。

即使保持相同的结构,也有更简单的写法:

select DATEADD(MONTH, DATEDIFF(MONTH, 0, getdate() ), 1)

或使用 DATEFROMPARTS,这是首选,因为它 explicit/obvious 您正在做的 并且 使用更现代的数据类型(date).


1你甚至不允许显式intdatetime2的转换。因为,真的,这没有意义。