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,…)
返回月数,而不是年数。非常感谢。。解释得很好