You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:10:42