T-SQL Date函数,Integer值为date参数

问题描述 投票:1回答:1

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

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

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

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

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

同样在DateAdd的情况下

有人请分享一些解释

sql-server tsql datediff
1个回答
5
投票

不幸的是,DATEADDDATEDIFF被指定与datetime(以及任何较新的datetime数据类型)一起使用。因此,他们继承了旧类型的许多肮脏,包括从implicit conversionsintdatetime被允许1。

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)

或者使用DATEFROMPARTS,这是首选,因为它使你明确/明显地做了什么,并使用更现代的数据类型(date)。


1你甚至不允许从intdatetime2的明确转换。因为,实际上,它没有意义。

© www.soinside.com 2019 - 2024. All rights reserved.