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

时间:2019-04-11 07:49:35

标签: sql-server tsql datediff

我试图修改旧查询并遇到此代码块

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

但是我相信dateadd和datediff函数需要一些date参数来进行计算。但是这里的DateDiff和DateAdd在Date参数的位置有一些整数值

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

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

对于DateAdd也是如此

有人请分享一些解释

1 个答案:

答案 0 :(得分:5)

不幸的是,指定DATEADDDATEDIFFdatetime(以及任何较新的日期时间数据类型)一起使用。因此,它们继承了许多旧类型的内容,包括允许从intdatetime的{​​{3}} 1

0转换为1900-01-01-1转换为1899-12-311转换为1900-01-02。简而言之,整数将转换为1900-01-01之后的“那么多”天。

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

即使保持相同的结构,也可以使用更简单的方法来编写:

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

或使用implicit conversions,这是首选方法,因为它使您在做的事情明确/明显,并且使用更现代的数据类型(date)。


1 甚至不允许您从intdatetime2进行显式转换。因为,实际上,这没有意义。