我试图修改旧查询并遇到此代码块
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也是如此
有人请分享一些解释
答案 0 :(得分:5)
不幸的是,指定DATEADD
和DATEDIFF
与datetime
(以及任何较新的日期时间数据类型)一起使用。因此,它们继承了许多旧类型的内容,包括允许从int
到datetime
的{{3}} 1 。
0
转换为1900-01-01
。 -1
转换为1899-12-31
。 1
转换为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 甚至不允许您从int
到datetime2
进行显式转换。因为,实际上,这没有意义。