MySQL BETWEEN运算符不适用于DATETIME列

时间:2018-02-25 11:03:51

标签: mysql between

我不明白为什么between运算符不适用于以下示例:

CREATE TABLE orders (
    packed DATETIME
);

INSERT INTO orders VALUES ('2018-02-24 00:00:00');

SELECT COUNT(*) FROM orders WHERE packed = '2018-02-24 00:00:00';
SELECT COUNT(*) FROM orders WHERE (packed BETWEEN '2018-02-00 00:00:00' AND '2018-03-00 00:00:00');

第一个select查询返回1。第二个查询返回0。为什么呢?

MySQL版本:14.14 Distrib 5.7.21

1 个答案:

答案 0 :(得分:2)

这取决于MySQL的sql_mode(STRICT_MODE):

set sql_mode=NO_ZERO_IN_DATE;

DROP TABLE orders;
CREATE TABLE orders (
    packed DATETIME
);

INSERT INTO orders VALUES ('2018-02-24 00:00:00');

SELECT COUNT(*) FROM orders WHERE packed = '2018-02-24 00:00:00';
-- 1
SELECT COUNT(*) FROM orders 
WHERE (packed BETWEEN '2018-02-00 00:00:00' AND '2018-03-00 00:00:00');
--0

<强> DBFiddle Demo

可是:

SELECT @@sql_mode; 
-- STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION


CREATE TABLE orders (
    packed DATETIME
);

INSERT INTO orders VALUES ('2018-02-24 00:00:00');

SELECT COUNT(*) FROM orders WHERE packed = '2018-02-24 00:00:00';
-- 1
SELECT COUNT(*) FROM orders 
WHERE (packed BETWEEN '2018-02-00 00:00:00' AND '2018-03-00 00:00:00');
-- 1

<强> DBFiddle Demo2

正确的方法是始终提供有效日期。