基于日期范围拉取数据:last_updated与program_end_day的7天筛选问题
筛选last_updated在program_end_day及之后7天内的行
核心逻辑
你需要的是last_updated等于program_end_day,或者在program_end_day之后7天内的记录,本质是让last_updated落在[program_end_day, program_end_day + 7天]的闭区间内。
不同数据库的正确SQL写法
SQL Server/Azure SQL
WHERE last_updated BETWEEN program_end_day AND DATEADD(DAY, 7, program_end_day)
MySQL/MariaDB
-- 两种写法都可行 WHERE last_updated BETWEEN program_end_day AND DATE_ADD(program_end_day, INTERVAL 7 DAY) -- 或更简洁的版本 WHERE last_updated BETWEEN program_end_day AND program_end_day + INTERVAL 7 DAY
PostgreSQL
WHERE last_updated BETWEEN program_end_day AND program_end_day + INTERVAL '7 days'
Oracle
WHERE last_updated BETWEEN program_end_day AND program_end_day + 7
验证示例数据
用你给出的测试数据验证:
- 第一条记录:
2024-03-13 <= 2024-03-15 <= 2024-03-20(2024-03-13加7天),符合条件; - 第二条记录:
2024-03-20 <= 2024-03-26 <= 2024-03-27(2024-03-20加7天),符合条件。
之前写法的问题
你之前使用的last_updated >= DATEADD(DAY,7,program_end_day)是筛选program_end_day7天之后的记录,和你的需求完全相反。如果数据库中存在较早的program_end_day,或者你误将天数参数设为负数(比如DATEADD(DAY,-7,...)),就会返回大量早于program_end_day多年的无效记录。
内容的提问来源于stack exchange,提问作者Garrett
相关产品推荐
相关产品推荐

