我正在为我的客户创建一个图表,他们想要在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:59到2:00:00一秒,但DateDiff按小时将返回1小时.同样地,1:00:00到2: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') = 969065DateAdd(hh, 969065 - 24, 0) = '20100719 17:00'并证明这与你的第一个表达式相同:
DateDiff(hh, '20100719 17:00', '20100720 17:52') = 24避免使用第一个版本.首先,因为它禁用了索引利用率.第一个版本的第二个(功能)问题是,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)
| 归档时间: |
|
| 查看次数: |
21938 次 |
| 最近记录: |