PostgreSQL查询未正确过滤注册日期不足30天的司机故障排查
问题根因
你写的过滤条件逻辑顺序颠倒了:v.registration_date::DATE - CURRENT_DATE::DATE < 30
你插入的测试数据中所有车辆注册日期都远早于当前日期,较早的日期减去较晚的日期得到的计算结果都是负数,所有负数天然满足<30的判断条件,因此全部数据都被返回。
修正方案
方案1:调整减法顺序(按自然日30天判断)
将日期减法的顺序调换,计算当前日期和注册日期的差值小于30即可:
select d.first_name , d.last_name , v.make from drivers d join vehicles v on v.driver_id= d.id where CURRENT_DATE - v.registration_date < 30;
方案2:按自然月判断(更贴合「不足1个月」的需求)
如果要严格匹配「注册日期距离当前不足1个自然月」的需求,更推荐用日期间隔判断,避免不同月份天数不同导致的逻辑偏差:
select d.first_name , d.last_name , v.make from drivers d join vehicles v on v.driver_id= d.id where v.registration_date >= CURRENT_DATE - INTERVAL '1 month';
注意:你当前插入的测试数据中所有注册日期均为多年前的历史日期,修改语句后查询结果会为空,你可以将任意一条测试数据的
registration_date修改为最近1个月内的日期,即可得到预期的仅返回1条符合条件数据的结果。
内容的提问来源于stack exchange,提问作者Asser
相关产品推荐
相关产品推荐

