【问题标题】:datediff and dateadd anomalydatediff 和 dateadd 异常
【发布时间】:2015-07-20 13:38:37
【问题描述】:

以下两个逻辑条件有什么区别(CreationDate的值都是DateTime)?

   and abs(datediff(hour, a.CreationDate, e.CreationDate)) < 12

和:

   and e.CreationDate > dateadd(hour, -12, a.CreationDate)
   and e.CreationDate < dateadd(hour,  12, a.CreationDate)

(是的,有区别——改变会产生不同的结果,但我看不出是什么)

背景

最近的question came up on Meta.se 关于“策展人”徽章和 12 小时编辑窗口。这个问题启发我制作一个我之前编写的 SQL 查询的副本,并制作新的副本“可变”大小的编辑窗口,而不是每边只有 12 小时。本质上,我更改了以下代码:

   and abs(datediff(hour, a.CreationDate, e.CreationDate)) < 12

成为:

   and e.CreationDate > dateadd(hour, -12, a.CreationDate)
   and e.CreationDate < dateadd(hour,  12, a.CreationDate)

(除了第二条语句中的12个值是变量)。

这两个查询位于 Stack Exchange 数据资源管理器中:originalcopied

不过,查询产生的结果略有不同......我真的很想知道为什么。我也无法确定哪个查询结果是正确的。我相信它必须归结为 datediff 逻辑中的某些东西......它是“四舍五入”小时还是什么,所以它的结果会稍微少一些?

日期差异:

添加日期:

【问题讨论】:

  • 您能打印出CreationDate 的值,然后按此排序,看看哪些是缺失的吗?这可能会为您提供有关正在发生的事情的线索。
  • 我还刚刚运行了您的查询并从每个查询中获得了 255 行,并且前几屏结果看起来相同。
  • 我链接的查询有 255 个结果,但第一条记录有 288 个问题,另一个有 287 个问题......这是 SEDE 表示层中的缓存问题,也许,@ChrisF

标签: sql-server tsql sede


【解决方案1】:

DateDiff 计算边界交叉点,而 DateAdd 进行简单的算术运算。

例如,第一个查询将计算 00:5912:01 之间的 12 个边界,因此会排除该差异,但第二个查询会将其计算为在 12 小时内。这使得第二个查询“正确”,而第一个查询“错误”。

【讨论】:

  • 一分钱下降......是的。你介意我编辑你的答案以包含一个例子吗?
  • 仅供参考 -> 引用回 from Meta.SE
猜你喜欢
  • 2021-11-15
  • 2018-10-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-18
  • 1970-01-01
  • 1970-01-01
  • 2022-06-15
相关资源
最近更新 更多