使用BETWEEN子句

时间:2012-06-15 10:31:28

标签: sql sql-server tsql sql-server-2000

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

哪一个性能更好?

2 个答案:

答案 0 :(得分:6)

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

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


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

  • x BETWEEN 0 AND 9


但是,如果数据是连续值,那么这不能很好地运作......

  • x BETWEEN 0.000 AND 9.999999999999999999


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

  • x >= 0 AND x < 10


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

答案 1 :(得分:4)

此外,请勿将BETWEEN用于日期/时间范围查询。

以下内容真正意味着什么?

BETWEEN '20120201' AND '20120229'

有些人认为这意味着从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毫秒内发生的一小部分数据。在大多数情况下,统计上不相关,但如果查询错误,则查询错误。

因此,对于日期范围查询,我总是强烈建议使用开放式范围,例如:报告2月份WHERE条款将在“2月1日或之后以及3月1日之前”说明如下:

WHERE date_col >= '20120201' AND date_col < '20120301'

BETWEEN只能使用date类型按预期工作,但我仍然更喜欢查询中的开放式范围,因为稍后有人可能会更改该基础数据类型以允许其包含时间。< / p>

我在这里写了很多细节: