我不明白为什么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
答案 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 强>
正确的方法是始终提供有效日期。