MySQL BETWEEN运算符异常:日期范围查询无结果问题求助
解决MySQL日期区间查询返回空结果的问题
首先,咱们先拆解你SQL语句里的两个核心问题:
1. DATE_FORMAT格式字符串的语法错误
你写的DATE_FORMAT(payments.payment_date,'%d/%m/%Y%')里,格式字符串最后多了一个多余的%符号,正确的写法应该是'%d/%m/%Y'。这个小错误会导致格式化后的日期字符串出现异常(比如变成28/05/2005%),自然和你指定的"28/05/2005"完全匹配不上。
2. 字符串比较日期的逻辑陷阱
就算你修正了格式字符串,用格式化后的字符串做BETWEEN比较依然会踩坑。因为字符串是按字典顺序比较的,比如"10/06/2005"和"28/05/2005":
- 第一个字符
'1'比'2'小,所以字符串层面"10/06/2005"<"28/05/2005" - 这时候你的
BETWEEN "28/05/2005" AND "10/06/2005"相当于查询一个左边界大于右边界的区间,自然返回空结果。 - 而当你把结束日期改成
"30/06/2005"时,"30/06/2005"的第一个字符'3'大于'2',区间变成左小右大,就能匹配到数据了。
正确的查询方式
最好的做法是直接用日期类型进行比较,避免字符串转换带来的问题。你可以把输入的日期字符串转换成DATE或DATETIME类型,再和数据库的payment_date字段比较:
SELECT * FROM payments LEFT JOIN rentals ON payments.rental_id = rentals.rental_id WHERE payments.payment_date BETWEEN STR_TO_DATE('28/05/2005', '%d/%m/%Y') AND STR_TO_DATE('10/06/2005 23:59:59', '%d/%m/%Y %H:%i:%s');
或者,如果你想简化结束日期的处理(避免手动加时间),可以用小于下一天的方式,这样能自动包含目标日期的所有时间点:
SELECT * FROM payments LEFT JOIN rentals ON payments.rental_id = rentals.rental_id WHERE payments.payment_date >= STR_TO_DATE('28/05/2005', '%d/%m/%Y') AND payments.payment_date < STR_TO_DATE('11/06/2005', '%d/%m/%Y');
这种方式不仅能准确匹配你想要的日期区间,还能利用payment_date字段上的索引(如果有的话),提升查询效率。
内容的提问来源于stack exchange,提问作者user7441072
相关产品推荐
相关产品推荐

