MySQL排除指定日期范围的查询不生效,返回全量数据如何解决?
SQL查询过滤未来日期问题修复方案
问题根因
- 语法逻辑错误:
BETWEEN要求左侧参数必须小于等于右侧参数,原语句中左侧是「明天」(DATE_ADD(cast(NOW() as date), INTERVAL 1 DAY)),右侧是当前时间(NOW()),左侧明显大于右侧,因此cast(booking_date as date) NOT BETWEEN 明天 AND 当前时间的判断结果永远为真,相当于过滤条件未生效,自然返回所有符合job_closed=0的数据。 - 需求不匹配:你需要过滤的是晚于「今日+7天」的日期,原语句完全没有用到7天的时间间隔,逻辑和需求不对应。
可行解决方案
场景1:仅排除晚于「今日+7天」的日期,保留其余所有符合条件的记录
SELECT * FROM work_jobs WHERE cast(booking_date as date) <= DATE_ADD(cast(NOW() as date), INTERVAL 7 DAY) AND job_closed = 0 ORDER BY booking_date ASC;
场景2:额外需要排除今日及更早日期,仅保留「明天」到「今日+7天」范围内的记录
SELECT * FROM work_jobs WHERE cast(booking_date as date) BETWEEN DATE_ADD(cast(NOW() as date), INTERVAL 1 DAY) AND DATE_ADD(cast(NOW() as date), INTERVAL 7 DAY) AND job_closed = 0 ORDER BY booking_date ASC;
注意:如果
booking_date字段本身就是DATE类型,不需要额外加cast转换,直接使用字段名即可,可提升查询效率,存在索引的情况下也能正常命中。
内容的提问来源于stack exchange,提问作者Mark Lamb
相关产品推荐
相关产品推荐

