San*_*mas 1 t-sql sql-server datediff
我试图修改旧查询并遇到此代码块
select DATEADD(MONTH, DATEDIFF(MONTH, -1,getdate() )-1, 1)
Run Code Online (Sandbox Code Playgroud)
但是我相信dateadd和datediff函数需要一些date参数来进行计算。但是这里的DateDiff和DateAdd在Date参数的位置有一些整数值
例如DATEDIFF(MONTH,-1,getdate())-1返回1431,它只是一个十进制值,但是根据文档的代码块查找Date参数。
https://www.w3schools.com/sql/func_sqlserver_datediff.asp
对于DateAdd也是如此
有人请分享一些解释
遗憾的是,DATEADD并DATEDIFF指定与工作datetime(以及任何更新的日期时间数据类型)。因此,它们继承了许多旧类型的内容,包括允许从进行隐式转换1。intdatetime
0转换为1900-01-01。-1转换为1899-12-31。1转换为1900-01-02。简而言之,整数将转换为1900-01-01之后的“那么多”天。
但是让我们看看您的代码。它计算的差异月从1899-12-31,然后减去具有一个补充说,同样长的时间到1900-01-02。这样做的最终效果是为您提供当前月份的第二个。
有更简单的方法可以编写此代码,甚至保持相同的结构:
select DATEADD(MONTH, DATEDIFF(MONTH, 0, getdate() ), 1)
Run Code Online (Sandbox Code Playgroud)
或使用DATEFROMPARTS,这是首选方法,因为它使您在做的事情明确/显而易见,并使用了更现代的数据类型(date)。
1您甚至都不允许将明确转换int为datetime2。因为,实际上,这没有任何意义。
| 归档时间: |
|
| 查看次数: |
64 次 |
| 最近记录: |