6

以下两个逻辑条件有什么区别(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)

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

背景

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 数据资源管理器中:原始复制

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

日期差异:

在此处输入图像描述

日期添加:

在此处输入图像描述

4

1 回答 1

8

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

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

于 2015-05-09T19:53:14.647 回答