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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了T-SQL Date函数,Integer值为date参数相关的知识,希望对你有一定的参考价值。

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

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的情况下

有人请分享一些解释

答案

不幸的是,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的明确转换。因为,实际上,它没有意义。

以上是关于T-SQL Date函数,Integer值为date参数的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL 时间/日期函数和操作符

Month 函数

T-SQL将当前行更新到下一行的值问题

T-SQL编程 —— 用户自定义函数(标量函数)

T-SQL和SQL的区别

数据库打印图形