
本文介绍如何通过sql where子句精准筛选出“不包含今日、仅含前3天”的连续日期记录,避免常见的时间范围误用问题。
本文介绍如何通过sql where子句精准筛选出“不包含今日、仅含前3天”的连续日期记录,避免常见的时间范围误用问题。
在实际业务场景中(如日志分析、销售统计或用户行为追踪),我们常需获取“截至昨日的最近三天”数据——即排除当天,只取 T−1、T−2、T−3 三个自然日的数据。但若直接使用 WHERE date > DATE_SUB(CURDATE(), INTERVAL 3 DAY),会得到包含今天在内的最近三天(例如:2022-05-12、2022-05-11、2022-05-10),这与需求相悖。
正确做法是显式定义左闭右开的时间区间:
✅ 排除今天 → date
✅ 包含三天前(含)→ date >= DATE_SUB(CURDATE(), INTERVAL 3 DAY)
组合后完整条件如下:
WHERE date = DATE_SUB(CURDATE(), INTERVAL 3 DAY)
以 CURDATE() 返回 2022-05-12 为例:
- DATE_SUB(CURDATE(), INTERVAL 3 DAY) = 2022-05-09
- 条件等价于:date >= '2022-05-09' AND date → 精确命中 2022-05-09、2022-05-10、2022-05-11 共3条记录。
⚠️ 注意事项:
- 确保 date 字段为 DATE 类型(非 DATETIME)。若为 DATETIME,建议先用 DATE(date) 转换,或改用 date >= '2022-05-09' AND date
- CURDATE() 返回的是服务器本地日期,生产环境需确认数据库时区与业务时区一致;
- 该写法兼容 MySQL 5.6+,在 PostgreSQL 或 SQL Server 中需替换为对应函数(如 CURRENT_DATE - INTERVAL '3 days')。
总结:时间范围查询务必明确边界语义——“最近N天不含今天”本质是长度为 N 的左闭右开区间 [T−N, T),而非模糊的“过去N天”。养成显式书写上下界习惯,可显著提升SQL的准确性与可维护性。










