如何编写适配全年的上月数据动态过滤SQL语句?
适配全年的动态月份过滤方案
方法一:利用日期偏移函数(推荐)
直接通过数据库内置的日期偏移函数计算上一个月的完整日期,再从中提取年和月,这种方式逻辑简洁且不易出错,适配绝大多数数据库:
以Oracle为例,修改后的过滤条件如下:
WHERE MONTH = EXTRACT(MONTH FROM ADD_MONTHS(SYSDATE, -1)) AND YEAR = EXTRACT(YEAR FROM ADD_MONTHS(SYSDATE, -1))
其他数据库的对应写法:
- MySQL:用
DATE_SUB(SYSDATE(), INTERVAL 1 MONTH)替代ADD_MONTHS(SYSDATE, -1) - SQL Server:用
DATEADD(MONTH, -1, GETDATE())替代ADD_MONTHS(SYSDATE, -1)
方法二:CASE语句手动判断年份和月份
如果不想依赖日期偏移函数,也可以通过CASE分支处理特殊情况:
WHERE MONTH = CASE WHEN EXTRACT(MONTH FROM SYSDATE) = 1 THEN 12 ELSE EXTRACT(MONTH FROM SYSDATE) - 1 END AND YEAR = CASE WHEN EXTRACT(MONTH FROM SYSDATE) = 1 THEN EXTRACT(YEAR FROM SYSDATE) - 1 ELSE EXTRACT(YEAR FROM SYSDATE) END
逻辑说明:当当前月份为1月时,目标月份设为12,年份设为当前年份减1;其余月份直接取当前月份减1,年份保持不变。
内容的提问来源于stack exchange,提问作者user16400720
相关产品推荐
相关产品推荐

