MySQL BETWEEN AND大坑
在日常使用MySQL的过程中,我们很习惯性的会使用“BETWEEN … AND…”来进行条件查询,筛选对应时间、状态的数据。
但,如果这个日期字段是日期/时间格式,那么坑就来了。
SELECT
* # 正式学习工作尽量不要直接使用 *,这里是自建的模拟表无所谓
FROM
test
WHERE
time BETWEEN '2023-04-01' AND '2023-04-20'
ORDER BY
time desc
输出结果:
但是!
实际上我们的表中是有2023-04-20这一天的数据的
SELECT
*
FROM
test
WHERE
DATE(time) = '2023-04-20'
MySQL的BETWEEN ... AND...
的取值确实是闭区间,但是如果日期字段包含时间,即2023-04-20 09:23:35
MySQL会将BETWEEN '2023-04-01' AND '2023-04-20'
自动转换为BETWEEN '2023-04-01 00:00:00' AND '2023-04-20 00:00:00'
也就是说,当日期字段带时间时,最后一天仅会获取00:00:00
这一时间点的数据,而非我们想象中的最后一天一整天的数据!
解决思路
- 使用
DATE()
DATE(time) BETWEEN '2023-04-01' AND '2023-04-20'
- 使用小于号,小于最后一天的后一天
time >= '2023-04-01' and time < '2023-04-21'
- 手动补上时间(不建议,麻烦且可能出现更多坑)
time BETWEEN '2023-04-01 00:00:00.000000' AND '2023-04-20 23:59:59.999999'