You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.28 06:15:39