如何获得 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 中两个日期变量之间的差异的主要内容,如果未能解决你的问题,请参考以下文章

如何获得两个日期之间的差异(informix)?

Laravel中两个日期之间的差异

获取 JavaScript 中两个日期之间的差异? [复制]

如何获得两个日期之间的小时差?

如何减去两个angularjs日期变量

查找两个日期之间的差异 Oracle SQL