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 也一样
有人请分享一些解释
不幸的是,DATEADD
和 DATEDIFF
被指定用于 datetime
(以及任何较新的日期时间数据类型)。因此,它们继承了旧类型的许多肮脏之处,包括 implicit conversions 从 int
到 datetime
是允许的1.
0
转换为 1900-01-01
。 -1
转换为 1899-12-31
。 1
转换为 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你甚至不允许显式从int
到datetime2
的转换。因为,真的,这没有意义。
我在尝试修改遗留查询时遇到了这个代码块
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 也一样
有人请分享一些解释
不幸的是,DATEADD
和 DATEDIFF
被指定用于 datetime
(以及任何较新的日期时间数据类型)。因此,它们继承了旧类型的许多肮脏之处,包括 implicit conversions 从 int
到 datetime
是允许的1.
0
转换为 1900-01-01
。 -1
转换为 1899-12-31
。 1
转换为 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你甚至不允许显式从int
到datetime2
的转换。因为,真的,这没有意义。