首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用BETWEEN子句

使用BETWEEN子句
EN

Stack Overflow用户
提问于 2012-06-15 18:31:28
回答 2查看 428关注 0票数 2

当您编写查询时,如果需要根据某个范围的值过滤出行,那么我应该使用BETWEEN子句还是<=>=

哪一个在性能上更好?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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

票数 6
EN

Stack Overflow用户

发布于 2012-06-15 20:08:18

此外,不要使用BETWEEN进行日期/时间范围查询。

下面这些到底是什么意思呢?

代码语言:javascript
复制
BETWEEN '20120201' AND '20120229'

有些人认为这意味着给我2月份的所有数据,包括2月29日的任何时候的所有数据。上面的代码被翻译成:

代码语言:javascript
复制
BETWEEN '20120201 00:00:00.000' AND '20120229 00:00:00.000'

因此,如果在午夜之后的任何时间都有数据,那么您的报告将是不完整的。

人们也会试着变得聪明,选择一天的“结束”:

代码语言:javascript
复制
BETWEEN '00:00:00.000' AND '23:59:59.997'

如果数据类型为datetime,则可以执行此操作。如果它是smalldatetime,则范围的末尾将向上舍入,并且您可能会包含第二天的数据,而您并不打算这样做。如果它是datetime2,那么您实际上可能会遗漏一天中最后几毫秒内发生的一小部分数据。在大多数情况下,统计上是无关的,但是如果查询是错误的,那么查询就是错误的。

因此,对于日期范围查询,我始终强烈建议使用开放式范围,例如,要报告2月月份,WHERE子句将显示“在2月1日或之后,在3月1日之前”,如下所示:

代码语言:javascript
复制
WHERE date_col >= '20120201' AND date_col < '20120301'

仅使用date类型,BETWEEN就可以像预期的那样工作,但我仍然倾向于在查询中使用开放式范围,因为以后可能会有人更改底层数据类型以允许它包含时间。

我在这里写了更多的细节:

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11049003

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档