SQL如何实现当前日期减30天并作为WHERE查询条件?
查询失效核心原因
BETWEEN操作符的匹配规则是 值 >= 左边界 且 值 <= 右边界,要求左边界必须小于等于右边界。你写的顺序是current_date(当日,日期值更大)在前、current_date - 30(30天前,日期值更小)在后,范围逻辑完全颠倒,数据库匹配不到任何符合条件的行。- 并非所有数据库都支持直接对日期类型做
- 数字的减法运算,直接写current_date - 30可能触发隐式类型转换,得到非预期的计算结果。
修正方案
基础适配(支持日期直接减整数的数据库:MySQL、PostgreSQL等)
调换BETWEEN的边界顺序,保证更早的日期作为左边界、更近的日期作为右边界即可:
WHERE pr.fact_day BETWEEN CURRENT_DATE - 30 AND CURRENT_DATE
注意:如果使用的是不支持日期直接做整数减法的数据库,需要调用对应内置日期函数计算30天前的时间点,避免类型转换错误:
- SQL Server:
WHERE pr.fact_day BETWEEN DATEADD(day, -30, CAST(GETDATE() AS DATE)) AND CAST(GETDATE() AS DATE) - Oracle:
WHERE pr.fact_day BETWEEN CURRENT_DATE - INTERVAL '30' DAY AND CURRENT_DATE - Hive/Spark SQL:
WHERE pr.fact_day BETWEEN date_sub(CURRENT_DATE, 30) AND CURRENT_DATE
优化建议
如果fact_day字段是带时分秒的datetime/timestamp类型,不建议使用BETWEEN做范围筛选,否则会漏掉边界日期的部分时段数据。更稳妥的半开区间写法如下(以MySQL语法为例,其他数据库替换对应日期函数即可),可以完整覆盖近30天(包含当日全天)的所有数据,不会因为时分秒精度问题漏数:
WHERE pr.fact_day >= DATE_SUB(CURRENT_DATE, INTERVAL 30 DAY) AND pr.fact_day < DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY)
内容的提问来源于stack exchange,提问作者Mahmoud Wahba
相关产品推荐
相关产品推荐

