如何编写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
相关产品推荐
相关产品推荐

