使用Integer值作为日期参数的T-SQL日期函数

San*_*mas 1 t-sql sql-server datediff

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

select   DATEADD(MONTH, DATEDIFF(MONTH, -1,getdate() )-1, 1)
Run Code Online (Sandbox Code Playgroud)

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

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

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

对于DateAdd也是如此

有人请分享一些解释

Dam*_*ver 5

遗憾的是,DATEADDDATEDIFF指定与工作datetime(以及任何更新的日期时间数据类型)。因此,它们继承了许多旧类型的内容,包括允许从进行隐式转换1intdatetime

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

但是让我们看看您的代码。它计算的差异1899-12-31,然后减去具有一个补充说,同样长的时间到1900-01-02。这样做的最终效果是为您提供当前月份的第二个。

有更简单的方法可以编写此代码,甚至保持相同的结构:

select DATEADD(MONTH, DATEDIFF(MONTH, 0, getdate() ), 1)
Run Code Online (Sandbox Code Playgroud)

或使用DATEFROMPARTS,这是首选方法,因为它使您在做的事情明确/显而易见,使用了更现代的数据类型(date)。


1您甚至都不允许将明确转换intdatetime2。因为,实际上,这没有任何意义。