9

我想找出对带有日期(无时间)的日期时间记录集进行查询的“最佳实践”方法是什么。

我使用了几个查询,这些查询从使用日期时间数据类型的记录集中返回基于日期范围的记录,这意味着需要使用中间范围检查每条记录。

查询示例为:

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

我知道 usingBETWEEN是一种资源消耗,并且检查日期的日期时间数据类型总是会占用大量资源,但我想听听其他人在这种情况下使用(或将使用)什么。

我会得到任何类型的性能提升,将日期时间记录转换为日期,例如:

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')
4

2 回答 2

11

你认为你知道的东西是不正确的。

usingBETWEEN或 DATETIME 数据类型都不是资源消耗。

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

也就是说,我会使用>=and<来代替。不是为了性能,而是逻辑正确。

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

无论该字段是否包含小时、分钟,甚至(具有神话数据类型)皮秒,这都将起作用。

通过字段上的索引,它还将进行范围扫描。

你不会变得更快。不需要任何技巧或功能。

于 2012-08-14T17:53:23.570 回答
0

关于日期有几个考虑因素。

首先,您要确保使用相关索引。一般来说,这意味着要避免列上的函数。这适用于日期以外的数据类型,但对于理解日期来说很普遍。因此,假设列已编入索引,从性能角度来看,CONVERT() 是一个坏主意。

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

至于“介于”和签名操作之间的选择。更好的做法是使用“<”和“>”以及“>=”和“<=”。它使日期的逻辑更清晰,并且不会出现秒数精确到 3 毫秒的问题。

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

因此,首选第三个版本。

于 2012-08-14T18:01:22.207 回答