如何获得 s-s-rS 中两个日期变量之间的差异
Posted
技术标签:
【中文标题】如何获得 s-s-rS 中两个日期变量之间的差异【英文标题】:How do I get the difference between two date variables in s-s-rS 【发布时间】:2014-01-27 18:54:44 【问题描述】:如果我使用此查询,它会起作用,因为日期相同:
DECLARE @Start datetime
DECLARE @End datetime
DECLARE @ServerName varchar(128)
SET @Start = '2014-01-24'
SET @End = '2014-01-24'
SET @ServerName = 'ServerName'
SELECT ServerName, cntr_value, collection_datetime
FROM PLE
WHERE CONVERT(DATE, collection_datetime) = @Start
AND CONVERT(DATE, collection_datetime) = @End
AND ServerName = @ServerName
但是,我想使用 @Start 和 @End 作为 s-s-rS 参数,因此我需要查看指定日期范围内的数据,所以我想我会使用类似下面的东西......除非它不起作用。
DECLARE @Start datetime
DECLARE @End datetime
DECLARE @ServerName varchar(128)
SET @Start = '2014-01-24'
SET @End = '2014-01-27'
SET @ServerName = 'Server'
SELECT ServerName, cntr_value, collection_datetime
FROM PLE
WHERE CONVERT(DATE, collection_datetime) = @Start
BETWEEN CONVERT(DATE, collection_datetime) = @End
AND ServerName = @ServerName
显然我不能使用 BETWEEN,但我还能用什么来完成这项工作?
【问题讨论】:
WHERE CONVERT(DATE, collection_datetime) BETWEEN @Start AND @End
有什么问题?
@StuartLC 这种方法的问题在于,它使 OP 可能在 collection_datetime
上定义的索引的可能使用无效,每次都有效地导致全扫描
【参考方案1】:
以索引友好的方式进行
SELECT ServerName, cntr_value, collection_datetime
FROM PLE
WHERE collection_datetime >= @Start
AND collection_datetime < DATEADD(DAY, 1, @End)
AND ServerName = @ServerName
注意:当您将函数应用于 WHERE
子句中的列时,您会阻止数据库引擎有效地使用您在该列上可能拥有(最好这样做)的任何索引(索引)导致全面扫描。
这里是SQLFiddle演示
推荐阅读:
Bad habits to kick : mis-handling date / range queries @AaronBertrand【讨论】:
以上是关于如何获得 s-s-rS 中两个日期变量之间的差异的主要内容,如果未能解决你的问题,请参考以下文章