T-SQL中获取过去24小时结果的最佳方法是什么?

14
我正在为我的客户创建一张图表,他们想要得到24小时、3天、1周、1个月等一段时间内的总客户数。由于我并不是SQL方面的专家,因此生成这些查询语句不是我的强项。
关于在24小时内获取客户数量,我找到了两个可能有效的“where”语句,但我不确定哪一个是最好的。 第一个版本:
WHERE DATEDIFF(hh,CreatedDate,GETDATE())>24

第二个版本:

WHERE CreatedDate >= DATEADD(HH, -24, GETDATE())

第一版生成了21行,第二版生成了17行(当然是从同一组数据集中生成),因此很明显其中一个比另一个更准确。我倾向于选择第一个版本,但我想知道你的意见......谢谢。

谢谢, 安德鲁


我认为 WHERE DATEDIFF(hh,CreatedDate,GETDATE())>24 需要改成 WHERE DATEDIFF(hh,CreatedDate,GETDATE())<24 - Jeremy Smyth
1
更准确地说,将 WHERE DATEDIFF(hh,CreatedDate,GETDATE())<=24 修改为匹配第二个逻辑 :) - Jeremy Smyth
3个回答

11

避免使用第一版本。首先,因为它会禁用索引利用。第一版本的第二个(功能性)问题是,DATEDIFF(HOUR...) 返回小于25小时的所有值。为了更清晰地表示,请尝试以下方法:

SELECT DATEDIFF(HOUR, '2010-07-19 00:00:00', '2010-07-20 00:59:59.99')

11

第一个版本不准确。

WHERE DateDiff(hh, CreatedDate, GETDATE()) > 24
这将返回值在 23.0001 小时前到 24.9999 小时前之间,因为你计算的是 "越过边界" 而不是实际的 24 小时时间段。请注意,从 1:59:592:00:00 只有一秒钟,但是用 DateDiff 计算小时数会返回 1 小时。同样,1:00:002:59:59 几乎是 2 小时,但是 DateDiff 计算小时数也会返回同样的 1 小时。
第二个版本是正确的。
WHERE CreatedDate >= DateAdd(hh, -24, GETDATE())

从当前日期减去24小时将得到一个时间,确切地说是24.0小时前的时间,精确到毫秒。因此,这将返回24小时的数据。

此外,即使第一个版本是你想要的,它也很糟糕,因为引擎必须对整个表中的每一行执行日期计算,使任何潜在的索引无用,并消耗大量不必要的CPU。相反,应该在列名的表达式的相反侧进行计算。为了在没有性能惩罚的情况下复制第一个表达式的逻辑,代码应该像这样:

WHERE CreateDate >= DateAdd(hh, DateDiff(hh, 0, GETDATE()) - 24, 0)

示例:

  • GetDate() = '20100720 17:52'
  • DateDiff(hh, 0, '20100720 17:52') = 969065
  • DateAdd(hh, 969065 - 24, 0) = '20100719 17:00'

为证明这与您的第一个表达式相同:

  • DateDiff(hh, '20100719 17:00', '20100720 17:52') = 24

0
也许这些适用于您每个where子句?
WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(hh, -24, GETDATE)

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(day, -3, GETDATE)

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(wk, -1, GETDATE)

WHERE CreatedDate < GETDATE() AND CreatedDate >= DATEADD(mm, -1, GETDATE)

正如Flo提到的索引,确保对CreatedDate列进行索引。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接