当您编写查询时,如果需要根据某个范围的值过滤出行,那么我应该使用BETWEEN子句还是<=和>=?
哪一个在性能上更好?
发布于 2012-06-15 18:34:12
都不是。它们创建完全相同的执行计划。
我使用它们的时间并不取决于性能,而是取决于数据。
如果数据是离散值,那么我使用BETWEEN...
x BETWEEN 0 AND 9但是如果数据是连续值,那么它就不能很好地工作。
x BETWEEN 0.000 AND 9.999999999999999999相反,我使用>= AND <...
x >= 0 AND x < 10然而,有趣的是,>= AND <技术实际上适用于连续和离散数据类型的。所以,总的来说,我很少使用BETWEEN。
发布于 2012-06-15 20:08:18
此外,不要使用BETWEEN进行日期/时间范围查询。
下面这些到底是什么意思呢?
BETWEEN '20120201' AND '20120229'有些人认为这意味着给我2月份的所有数据,包括2月29日的任何时候的所有数据。上面的代码被翻译成:
BETWEEN '20120201 00:00:00.000' AND '20120229 00:00:00.000'因此,如果在午夜之后的任何时间都有数据,那么您的报告将是不完整的。
人们也会试着变得聪明,选择一天的“结束”:
BETWEEN '00:00:00.000' AND '23:59:59.997'如果数据类型为datetime,则可以执行此操作。如果它是smalldatetime,则范围的末尾将向上舍入,并且您可能会包含第二天的数据,而您并不打算这样做。如果它是datetime2,那么您实际上可能会遗漏一天中最后几毫秒内发生的一小部分数据。在大多数情况下,统计上是无关的,但是如果查询是错误的,那么查询就是错误的。
因此,对于日期范围查询,我始终强烈建议使用开放式范围,例如,要报告2月月份,WHERE子句将显示“在2月1日或之后,在3月1日之前”,如下所示:
WHERE date_col >= '20120201' AND date_col < '20120301'仅使用date类型,BETWEEN就可以像预期的那样工作,但我仍然倾向于在查询中使用开放式范围,因为以后可能会有人更改底层数据类型以允许它包含时间。
我在这里写了更多的细节:
https://stackoverflow.com/questions/11049003
复制相似问题