MSSQL针对一天或一天​​范围的日期范围的最佳查询

时间:2012-08-14 17:30:58

标签: sql sql-server datetime range

我想知道对具有日期(没有时间)的日期时间记录集的查询的“最佳实践”方法是什么。

我使用多个查询根据日期范围从使用日期时间数据类型的记录集返回记录,这意味着需要使用两者之间的范围来检查每条记录。

查询示例如下:

Select * 
FROM Usages 
where CreationDateTime between '1/1/2012' AND '1/2/2012 11:59:59'

我知道使用BETWEEN是一种资源匮乏,检查日期的日期时间数据类型总是非常耗费资源,但我想听听别人使用(或将使用)的内容这种情况。

我是否会将日期时间记录转换为类似日期的任何类型的性能提升:

Select * 
FROM Usages 
where CONVERT(DATE,CreationDateTime) between '1/1/2012' AND '1/2/2012'

或者可能会检查少于/更多呢?

Select * 
FROM Usages 
where (CreationDateTime > '1/1/2012') 
    AND (CreationDateTime < '1/2/2012 11:59:59')

2 个答案:

答案 0 :(得分:6)

您认为您所知道的不正确。

使用BETWEEN或DATETIME数据类型都不是资源占用。

如果您为列编制索引,该列确实是DATETIME而不是VARCHAR(),并且您没有将该字段包装在函数中,那么一切都会很好而且快速。

那就是说,我会改用>=<。不是为了表现,而是为了逻辑正确。

WHERE
  myField >= '20120101'
  AND myField < '20120102'

无论该字段是否包含小时,分钟或甚至(具有神秘数据类型)pico秒,这都将有效。

使用该字段的索引,它还将进行范围扫描。

你不会更快。不需要技巧或功能。

答案 1 :(得分:0)

关于日期,有几个注意事项。

首先,您要确保使用相关索引。通常,这意味着避免列上的功能。这适用于除日期之外的数据类型,但是用于理解日期的优先级。因此,从性能角度来看,CONVERT()是一个坏主意,假设列已被索引。

其次,您希望避免格式之间不必要的转换。因此,必须对每一行调用函数。相反,将常量字符串转换为日期/时间在编译时发生一次。第一个效率较低。避免CONVERT()的另一个原因。但是,在许多查询中,其他处理(例如连接)比转换更耗时,因此这可能并不重要。

至于“之间”和签名操作之间的选择。更好的做法是使用“&lt;”和“&gt;”和“&gt; =”和“&lt; =”。它使日期的逻辑更清晰,并且没有像秒精确到3毫秒的问题。

据我所知,在日期之间使用索引与其他类型的字段一样有效。但是,为了准确性和便携性,最好进行个别比较。

因此,第三个版本将是首选。