Navicat mqsql 日期查询

select * from historydata WHERE recordtime BETWEEN '2017-12-29 0:00:00' and '2018-1-2 7:00:00'

图片说明

为什么这个sql语句还能查出这两条数据?真是奇葩。但是我这样写就没问题了:

select * from historydata WHERE recordtime BETWEEN '2017-12-29 0:00:00' and '2018-01-02 7:00:00'

区别就在2018-1-2和2018-01-02,但是为什么,sql语句这么不智能的吗

。。。该怎么解决啊,求大佬告知呀

我这边没发现问题
mysql 5.7 + navicat 12.1 和 sqlyog 12.3.1

检查下表historydata的recordtime列数据类型是datetime还是varchar,如果是varchar,就会出现那个问题,因为字符串04要比1小

你自己已经说了,日期格式不对。这个是比较严格的
或者转换
str_to_date('2018-1-2','%Y-%m-%d')

把建表语句贴出来,我在我的本地环境测试没这个问题,我的数据库版本是 mysql 8.0

mysql> create table t_date(id int,dt timestamp);
Query OK, 0 rows affected (0.03 sec)

mysql>
mysql> insert into t_date values(1,'2018-04-24 09:00:00'),(2,'2018-04-24 10:00:00');
Query OK, 2 rows affected (0.01 sec)
Records: 2  Duplicates: 0  Warnings: 0

mysql> select * from t_date;
+------+---------------------+
| id   | dt                  |
+------+---------------------+
|    1 | 2018-04-24 09:00:00 |
|    2 | 2018-04-24 10:00:00 |
+------+---------------------+
2 rows in set (0.00 sec)

mysql>
mysql> select * from t_date where dt BETWEEN '2017-12-29 0:00:00' and '2018-1-2 7:00:00';
Empty set (0.00 sec)

真实个神人 就算强制类型转化也不能有空格这些符号吧。mysql有日期类型啊,如果是字符串转日期类型那就需要函数来解决,或者你客户端做转化