Sql server 以整数值作为日期参数的T-SQL日期函数
我试图修改一个遗留查询,但遇到了这个代码块Sql server 以整数值作为日期参数的T-SQL日期函数,sql-server,tsql,datediff,Sql Server,Tsql,Datediff,我试图修改一个遗留查询,但遇到了这个代码块 select DATEADD(MONTH, DATEDIFF(MONTH, -1,getdate() )-1, 1) 但我相信dateadd和datediff函数需要一些日期参数来进行计算。但是这里DateDiff和DateAdd在日期参数的位置有一些整数值 例如,DATEDIFF(MONTH,-1,getdate())-1返回1431,这只是一个十进制值,但代码块根据文档查找日期参数 DateAdd的情况也一样 请大家分享一些解释不幸的是,D
select DATEADD(MONTH, DATEDIFF(MONTH, -1,getdate() )-1, 1)
但我相信dateadd和datediff函数需要一些日期参数来进行计算。但是这里DateDiff和DateAdd在日期参数的位置有一些整数值
例如,DATEDIFF(MONTH,-1,getdate())-1返回1431,这只是一个十进制值,但代码块根据文档查找日期参数
DateAdd的情况也一样
请大家分享一些解释不幸的是,
DATEADD
和DATEDIFF
被指定用于datetime
(以及任何更新的datetime数据类型)。因此,它们继承了许多旧类型的污点,包括允许从int
到datetime
的污点1
0
转换为1900-01-01
<代码>-1转换为1899-12-31
<代码>1转换为1900-01-02
。简言之,整数转换为1900-01-01之后的“那么多”天
但是让我们看看你的代码。它计算从1899-12-31
到1900-01-02
的月差,然后减去一个月,将相同的月数相加到1900-01-02
。这样做的净效果是给你本月的第二个月
即使保持相同的结构,也有更简单的编写方法:
select DATEADD(MONTH, DATEDIFF(MONTH, 0, getdate() ), 1)
或者使用,这是首选,因为它使您所做的事情明确/明显,并使用更现代的数据类型(date
)
1甚至不允许从
int
到datetime2
进行显式转换。因为,真的,这没有意义。请注意,W3School页面通常是。始终参考我从不推荐的网站。w3school
是w3school
——一个包含入门级HTML和Javascript教程以及一些SQL数据库的网站。这不是SQL Server的文档。它也不是Mozilla的MDN——不要指望它在获取或文件API上的文档比MDN更好。这可能是了解函数存在性的好方法,但实际文档要好得多,而且通常更易于使用。甚至谷歌在W3School之前也会返回doc站点,W3School上的这个手册页面是错误的:“返回两个日期值之间的差值,以年为单位:”这是错误的。这将返回一个整数,该整数是两个日期之间的差值,但格式由第一个参数定义DATEDIFF(MONTH,…)
返回月数,而不是年数。非常感谢。。解释得很好