使用mySQL运算符BETWEEN和经典日期间隔有什么区别?

7
可能重复:
SQL中“between”运算符和“>=”和“<=”运算符的区别 我发现我的开发人员正在使用此结构选择所选日期间隔的数据:
SELECT ... WHERE `date` >= '2011-11-28' AND `date` <= '2011-12-04'

我建议他使用 BETWEEN 操作符,就像这样:

SELECT ... WHERE date BETWEEN '2011-11-28' AND '2011-12-04'

哪个解决方案更好,有哪些争论点?
(注意:保留HTML标记)
4个回答

4
据我所知,在执行效率方面,这两种方法没有区别。但是,“BETWEEN X AND Y”似乎更易读和美观,因此我想使用这种方式代替“date >= '2011-11-28' AND date <= '2011-12-04'”。
但是,如果你在你的应用程序中编写简单的日期时间过滤器,你需要有机会仅选择第一个或第二个日期——这种情况下应该使用“date >= '2011-11-28' AND date <= '2011-12-04'”(我们可以在查询构建器中省略“date >= '2011-11-28'”或省略“date <= '2011-12-04'”而不会有问题)。

2
我不确定这是否是“经典”的日期区间,例如对于当前月份的期间,我认为应该是:
SELECT ... WHERE `date` >= '2011-12-01' AND `date` < '2012-01-01'

这段文字讨论了时间的连续性和期间的分割。换句话说,在理论上不可能定义当前月份的最后一个时间微粒。它是在新年1月1日午夜前一微秒还是一纳秒?实际上,你可以使用数据库管理系统中的时间数据类型来定义最小的时间微粒。然而,这会将时间模型从连续变为离散的时间点系列,并且需要额外的工作来确保使用相同的时间微粒进行比较。典型的错误是,当前月份被定义为“start_date=2011-01-12 end_date=2011-12-31”在一天的时间微粒下,然后有人想知道为什么“DATETIME”值“2011-12-31 12:00:00”不属于当前月份,或者更糟糕的是,不属于任何一个月份!
相比之下,容易定义当前月份未包含的第一个时间微粒,即以一天时间微粒为单位的1月1日。这在文献中被称为封闭开放表示法或“半开放表示法”,似乎是最广泛使用的方法。
总之,除非你能确保可以有效地消除小于一天时间微粒的时间值(我认为你做不到!),否则请使用封闭开放表示法,并避免使用“BETWEEN”来测试一个值是否属于一个期间。

1

来自MySQL手册

expr BETWEEN min AND max

如果表达式expr大于或等于min并且小于或等于max,则BETWEEN返回1,否则返回0。如果所有参数都是相同类型,则这相当于表达式(min <= expr AND expr <= max)。

0

我的偏好是使用BETWEEN,因为在我看来这样更容易阅读。

从技术角度来看(性能和返回值),两者没有区别。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接