在SQL Server 2022中如何动态获取表的最近12个月数据?
获取最近12个月数据的SQL方案(SQL Server 2022)
假设你的表名为YourTableName,先将表中的Year和MonthID字段组合成可计算的日期值,再筛选符合条件的记录。以下提供两种常见场景的实现:
场景1:基于当前系统日期的最近12个月
该方案以当前日期为基准,筛选过去12个月内的所有记录:
SELECT Year, MonthID, Value FROM YourTableName WHERE DATEFROMPARTS(Year, MonthID, 1) >= DATEADD(MONTH, -12, DATEFROMPARTS(YEAR(GETDATE()), MONTH(GETDATE()), 1)) ORDER BY Year DESC, MonthID DESC;
代码说明
DATEFROMPARTS(Year, MonthID, 1):将Year和MonthID转换为对应月份的第一天(比如2023和3转为2023-03-01),方便日期比较。DATEADD(MONTH, -12, ...):计算当前月份第一天往前推12个月的日期,作为筛选的起始边界。- 最后按年月倒序排列,方便查看最新数据。
场景2:基于表中最大年月的最近12个月
如果需要以表中已存在的最晚年月为基准,筛选其过去12个月的记录(适合数据未同步到当前月份的场景):
WITH MaxYearMonth AS ( SELECT MAX(DATEFROMPARTS(Year, MonthID, 1)) AS MaxMonthDate FROM YourTableName ) SELECT t.Year, t.MonthID, t.Value FROM YourTableName t CROSS JOIN MaxYearMonth m WHERE DATEFROMPARTS(t.Year, t.MonthID, 1) >= DATEADD(MONTH, -12, m.MaxMonthDate) ORDER BY t.Year DESC, t.MonthID DESC;
代码说明
- 先用CTE
MaxYearMonth获取表中最新的月份日期。 - 通过
CROSS JOIN将该最大日期与主表关联,筛选出该日期往前12个月内的所有记录。
注意事项
- 请将
YourTableName替换为你的实际表名。 - 如果表中存在缺失的月份,上述语句只会返回存在的记录;若需要补全缺失月份并显示0或NULL,需额外生成连续月份列表进行左连接。
内容的提问来源于stack exchange,提问作者user2545157
相关产品推荐
相关产品推荐

