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

ajt*_*tum 14 t-sql sql-server

我正在为我的客户创建一个图表,他们想要在24小时,3天,1周,1个月等期间获得总客户数.老实说,我不是最好的SQL,所以生成这些查询并不是我的强项.

关于让客户超过24小时,我遇到了两个可能有效的"where"陈述,但我不确定哪个是最好的.

第一版:

WHERE DATEDIFF(hh,CreatedDate,GETDATE())>24
Run Code Online (Sandbox Code Playgroud)

第二版:

WHERE CreatedDate >= DATEADD(HH, -24, GETDATE())
Run Code Online (Sandbox Code Playgroud)

第一个版本生成21行,第二个生成17行(当然来自同一个数据集),所以显然一个比另一个更准确.我倾向于第一个,但我想你的意见......拜托.

谢谢,安德鲁

Eri*_*ikE 11

第一个版本不准确.

WHERE DateDiff(hh, CreatedDate, GETDATE()) > 24
Run Code Online (Sandbox Code Playgroud)

这将返回从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())
Run Code Online (Sandbox Code Playgroud)

将24小时添加到当前日期将产生恰好24.0小时前的时间,达到毫秒.这将返回24小时的数据.

此外,即使它是您想要的,第一个版本也会很糟糕,因为引擎必须在整个表中的每一行上执行日期数学运算,这使得任何潜在的索引都无用并消耗了大量不必要的CPU.相反,在列名称的表达式的另一侧进行数学运算.复制第一个表达式的逻辑而没有性能损失将如下所示:

WHERE CreateDate >= DateAdd(hh, DateDiff(hh, 0, GETDATE()) - 24, 0)
Run Code Online (Sandbox Code Playgroud)

例:

  • 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


Flo*_*chl 9

避免使用第一个版本.首先,因为它禁用了索引利用率.第一个版本的第二个(功能)问题是,DATEDIFF(HOUR...)返回所有小于25小时的值.为清楚起见,请尝试这

SELECT DATEDIFF(HOUR, '2010-07-19 00:00:00', '2010-07-20 00:59:59.99')
Run Code Online (Sandbox Code Playgroud)