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

如何编写SQL WHERE子句查询最近三个完整月份数据(排除当前月)

筛选最近三个完整月份数据的WHERE子句写法

核心逻辑是定位当前月份之前的连续三个自然月,即从当前月往前推3个月的第一天,到当前月第一天的前一刻(避免时间部分的遗漏)。以下是通用及主流数据库的实现方式:

通用ODBC兼容写法(适配SQL Server等)

"Table"."OrderDate" >= DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP) - 3, 0)
AND "Table"."OrderDate" < DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0)

逻辑解释

  • DATEADD(month, DATEDIFF(month, 0, CURRENT_TIMESTAMP), 0):计算当前月份的第一天(例如2023-01-01)
  • 减3个月后得到三个完整月的起始日期(2022-10-01)
  • 用< 当前月第一天替代<= 前一个月最后一天,能自动包含该月所有带时间的记录(如2022-12-31 23:59:59)

其他数据库适配写法

MySQL/MariaDB

"Table"."OrderDate" >= DATE_FORMAT(DATE_SUB(CURDATE(), INTERVAL 3 MONTH), '%Y-%m-01')
AND "Table"."OrderDate" < DATE_FORMAT(CURDATE(), '%Y-%m-01')

Oracle

"Table"."OrderDate" >= ADD_MONTHS(TRUNC(SYSDATE, 'MM'), -3)
AND "Table"."OrderDate" < TRUNC(SYSDATE, 'MM')

常见问题排查

你之前的方法出错,大概率是没有基于月份起始/结束做判断,而是用当前日期直接减时间跨度,导致出现跨月遗漏或包含当前月数据的问题。比如直接用CURRENT_TIMESTAMP - 3 MONTH会得到2022-10-25(假设今天是2023-01-25),漏掉10月1日至24日的数据;若错误包含了当前月的边界判断,就会拉到1月的部分数据。

内容的提问来源于stack exchange,提问作者LTS

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 12:45:43