【问题标题】:T-SQL Date function with Integer values as date parameter以整数值作为日期参数的 T-SQL 日期函数
【发布时间】:2019-04-11 07:49:35
【问题描述】:

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

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 的情况下也是如此

请大家解释一下

【问题讨论】:

  • 请注意,W3School 页面通常是inaccurate。始终参考official documentation
  • 我绝不会推荐那个网站。
  • w3schoolw3school - 一个带有入门级 HTML 和 Javascript 教程的站点,其中包含一些 SQL 数据库。它不是 SQL Server 的文档。它也不是 Mozilla 的 MDN——不要指望它在 Fetch 或 File API 上有比 MDN 更好的文档。这可能是了解函数 存在 的好方法,但实际的文档要好得多,而且通常更容易使用。甚至 google 在 W3School 之前返回 doc 站点
  • W3School 上的这个手册页是错误的:"返回两个日期值之间的差,以年为单位:" 这是错误的。这将返回一个 int,它是 2 个日期之间的差异,但格式由第一个参数定义。 DATEDIFF(MONTH, ...) 返回月数,而不是年数。

标签: sql-server tsql datediff


【解决方案1】:

不幸的是,DATEADDDATEDIFF 被指定用于 datetime(以及任何较新的日期时间数据类型)。因此,它们继承了旧类型的许多讨厌之处,包括允许从 intdatetimeimplicit conversions1

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显式 转换。因为,真的,这没有意义。

【讨论】:

  • 非常感谢..很好的解释
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-30
  • 2018-09-22
相关资源
最近更新 更多