2

每当您编写查询时需要过滤出一系列值上的行时,我应该使用BETWEEN子句还是<=and >=

哪一个在性能上更好?

4

2 回答 2

6

两者都不。他们创建完全相同的执行计划。

我使用它们的时间不取决于性能,而是取决于数据。


如果数据是离散值,那么我使用BETWEEN...

  • x BETWEEN 0 AND 9


但是,如果数据是连续值,那么效果就不太好了……

  • x BETWEEN 0.000 AND 9.999999999999999999


相反,我使用>= AND <...

  • x >= 0 AND x < 10


然而,有趣的是,该>= AND <技术实际上适用于连续和离散数据类型。所以,总的来说,我很少使用BETWEEN

于 2012-06-15T10:34:12.463 回答
4

此外,不要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类型按预期工作,但我仍然更喜欢查询中的开放范围,因为稍后有人可能会更改该基础数据类型以允许它包含时间。

我在这里写了很多详细信息:

于 2012-06-15T12:08:18.083 回答