每当您编写查询时需要过滤出一系列值上的行时,我应该使用BETWEEN
子句还是<=
and >=
?
哪一个在性能上更好?
两者都不。他们创建完全相同的执行计划。
我使用它们的时间不取决于性能,而是取决于数据。
如果数据是离散值,那么我使用BETWEEN
...
x BETWEEN 0 AND 9
但是,如果数据是连续值,那么效果就不太好了……
x BETWEEN 0.000 AND 9.999999999999999999
相反,我使用>= AND <
...
x >= 0 AND x < 10
然而,有趣的是,该>= AND <
技术实际上适用于连续和离散数据类型。所以,总的来说,我很少使用BETWEEN
。
此外,不要BETWEEN
用于日期/时间范围查询。
下面的真正含义是什么?
BETWEEN '20120201' AND '20120229'
有些人认为这意味着让我获取 2 月份的所有数据,包括 2 月 29 日的所有数据。以上被翻译成:
BETWEEN '20120201 00:00:00.000' AND '20120229 00:00:00.000'
因此,如果在 29 日午夜之后的任何时间有数据,那么您的报告将是不完整的。
人们还试图变得聪明并选择一天的“结束”:
BETWEEN '00:00:00.000' AND '23:59:59.997'
如果数据类型是datetime
. 如果它是smalldatetime
范围的末尾,则四舍五入,并且您可能会包含第二天的数据,而您并不打算这样做。如果是这样,datetime2
您实际上可能会错过一天中最后 2 毫秒以上发生的一小部分数据。在大多数情况下,统计上不相关,但如果查询错误,则查询错误。
因此,对于日期范围查询,我始终强烈建议使用开放式范围,例如,在 2 月份报告时,该WHERE
子句会说“在 2 月 1 日或之后,3 月 1 日之前”,如下所示:
WHERE date_col >= '20120201' AND date_col < '20120301'
BETWEEN
可以仅使用该date
类型按预期工作,但我仍然更喜欢查询中的开放范围,因为稍后有人可能会更改该基础数据类型以允许它包含时间。
我在这里写了很多详细信息: