使用 mySQL 运算符 BETWEEN 和经典日期间隔之间有啥区别? [复制]
Posted
技术标签:
【中文标题】使用 mySQL 运算符 BETWEEN 和经典日期间隔之间有啥区别? [复制]【英文标题】:Where is difference between using of mySQL operator BETWEEN and classic date interval? [duplicate]使用 mySQL 运算符 BETWEEN 和经典日期间隔之间有什么区别? [复制] 【发布时间】:2011-12-12 10:27:12 【问题描述】:可能重复:Difference in SQL Between operator and “>=” & “<=” operator
我看到我的开发人员正在使用这种结构来选择选定日期间隔的数据:
SELECT ... WHERE `date` >= '2011-11-28' AND `date` <= '2011-12-04'
我推荐他像这样使用BETWEEN
运算符:
SELECT ... WHERE date BETWEEN '2011-11-28' AND '2011-12-04'
哪种解决方案更好,它的论据是什么?
【问题讨论】:
【参考方案1】:AFAIK,就执行效率而言,这种方法没有区别。但是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
【讨论】:
【参考方案2】:我不确定这是“经典”日期间隔,例如在本月的这段时间里,虽然是
SELECT ... WHERE `date` >= '2011-12-01' AND `date` < '2012-01-01'
这个想法是时间是一个连续体,一个时期是无限可分的。换句话说,理论上不可能定义当前月份的最后一个时间颗粒。是 1 月 1 日午夜前一微秒吗?一纳秒?
嗯,在实践中,可以使用您选择的 DBMS 中的时间数据类型来定义最小时间粒度。但是,这会将时间模型从连续体更改为一系列离散的时间点,您需要做很多额外的工作来确保使用相同的时间颗粒进行比较。经典的错误是当前月份在一天的时间颗粒中定义为start_date = 2011-01-12 end_date = 2011-12-31
,然后有人想知道为什么DATETIME
值2011-12-31 12:00:00
不属于当前月份,或者更糟糕的是,根本不属于任何月份!
相比之下,很容易定义不包含在当前月份的第一个时间粒度,即 1 月 1 日的一天时间粒度。这在文献中被称为封闭开放表示或“半开放”,似乎是最广泛使用的。
总之,除非您可以确保可以从您的模型中有效地消除小于一天的时间颗粒的时间值(我建议您不能!)然后使用闭开表示并避免BETWEEN
来测试是否一个值落在一个周期内。
【讨论】:
【参考方案3】:来自mysql Manual:
expr BETWEEN min AND max
如果 expr 大于等于 min 且 expr 小于等于 max,则 BETWEEN 返回 1,否则返回 0。这相当于表达式 (min <= expr AND expr <= max
) 如果所有参数都相同输入。
【讨论】:
【参考方案4】:我更喜欢使用 BETWEEN,因为它更容易阅读(在我看来)。
从技术角度来看(性能,返回什么)没有区别
【讨论】:
以上是关于使用 mySQL 运算符 BETWEEN 和经典日期间隔之间有啥区别? [复制]的主要内容,如果未能解决你的问题,请参考以下文章
MySQL的WHERE语句中BETWEEN与IN的用法和他们的区别