这是针对MySQL BETWEEN的功能吗?

时间:2014-04-25 08:40:11

标签: mysql

例如,在工作中我们有一个包含开始和结束日期的商品表。如果报价始终在运行,则可能是结束日期的开始具有NULL值。我来了一个查询,不得不做这样的事情

WHERE ( ISNULL(end_date) OR end_date > '2014-01-01 00:00:00' ) ...

我想知道使用BETWEEN是否可行,即使结束日期的开始是NULL。

select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:41' AND '2014-04-24 14:54:43'; -- 1
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:43' AND '2014-04-24 14:54:41'; -- 0
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:43' AND '2014-04-24 14:54:43'; -- 0

select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:43' AND NULL; -- 0
select '2014-04-24 14:54:42' BETWEEN NULL AND '2014-04-24 14:54:41'; -- 0
select '2014-04-24 14:54:42' BETWEEN NULL AND '2014-04-24 14:54:43'; -- NULL
select '2014-04-24 14:54:42' BETWEEN '2014-04-24 14:54:41' AND NULL; -- NULL

当你得到最后两个查询的NULL结果似乎是有道理的,因为MySQL不能确定日期是在2个值之间但是从它做的数据它不是假的。由于我们使用NULL来实现有效的低值和高值,因此我们可以将NULL视为真正的业务逻辑。

这实际上是MySQL在这里说的吗?或者这更像是一种怪癖,不应该依赖它?

服务器版本:5.6.16-64.2-56-log Percona Server(GPL),版本64.2,修订版569

1 个答案:

答案 0 :(得分:1)

是的,这是有目的的。实际上,你的答案在于MySQL中的AND运算符机制。它适用于简短的评估方案,即使你的一个操作数是NULL,如果另一个操作数为零(false),整个表达式将被计算为false(零):

  

逻辑AND。如果所有操作数都非零且非NULL,则求值为1,   如果一个或多个操作数为0,则为0,否则返回NULL。

     

的MySQL>选择1&& 1;

    -> 1 
     

的MySQL>选择1&& 0;

    -> 0 
     

的MySQL>选择1&& NULL;

    -> NULL 
     

的MySQL> SELECT 0&& NULL;

    -> 0 
     

的MySQL> SELECT NULL&& 0;

    -> 0

由于BETWEEN完全等同于使用AND评估两个表达式:(min <= expr AND expr <= max)您的表达式NULL - s等于:

SELECT @min<=@date_value AND @date_value<=@max

(我已经替换了值来表示结构)。因此,如果其中一个表达式被评估为false(零) - 整个表达式的结果将为false(零),而不是 NULL。但如果不是 - 那么结果将是NULL,因为我们无法对1 AND NULL发表任何意见(就像在最后两次查询中一样)。

所以,决议:,这是有意的。 ,您可以依赖事实,0 AND NULL会产生01 OR NULL相同,导致1)。