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

如何获取上一年的12月?现有SQL查询仅返回年份求助

解决SQL获取上一年12月日期的问题

嗨,我来帮你搞定这个问题!你现在的需求是拿到上一年的12月相关日期,但目前用的两种方法要么返回去年的当前月份(比如现在是2024年5月,就得到2023年5月),要么只返回年份数字,完全没有月份信息,对吧?

我给你几个实用的解决方案,适配不同版本的SQL Server(你用了GETDATE(),应该是SQL Server环境):

方法1:最直观的构造(SQL Server 2012+)

用DATEFROMPARTS函数直接指定年、月、日,这是最清晰易懂的方式:

  • 获取上一年12月1日:
    DATEFROMPARTS(DATEPART(YYYY, GETDATE()) - 1, 12, 1)
    
  • 获取上一年12月31日(也就是当年1月1日的前一天):
    DATEADD(day, -1, DATEFROMPARTS(DATEPART(YYYY, GETDATE()), 1, 1))
    

方法2:字符串拼接兼容旧版本

如果你的SQL Server版本低于2012(不支持DATEFROMPARTS),可以用字符串拼接后转成日期类型:

  • 上一年12月1日:
    CAST(CAST(DATEPART(YYYY, GETDATE()) - 1 AS VARCHAR(4)) + '-12-01' AS DATE)
    

方法3:纯DATEADD组合(兼容所有版本)

用日期加减的方式一步步推导,不需要字符串转换:

-- 先转到当年1月1日,减一年得到去年1月1日,再加11个月就是去年12月1日
DATEADD(month, 11, DATEADD(year, -1, DATEADD(day, 1 - DATEPART(day, GETDATE()), DATEADD(month, 1 - DATEPART(month, GETDATE()), GETDATE()))))

为什么你之前的方法不行?

  • DATEADD(year,-1,GETDATE()):这个函数是把当前日期整体减一年,比如今天是2024-05-20,返回的是2023-05-20,月份还是当前的5月,自然不是12月。
  • DATEPART(YYYY,GETDATE())-1:这个只是提取当前年份的数字然后减1,返回的是一个整数(比如2023),不是日期类型,所以根本没有月份信息。

如果你需要查询去年12月的所有数据

可以先定义两个变量存储起止日期,再用于查询:

DECLARE @LastDecStart DATE = DATEFROMPARTS(DATEPART(YYYY, GETDATE()) - 1, 12, 1);
DECLARE @LastDecEnd DATE = DATEADD(day, -1, DATEFROMPARTS(DATEPART(YYYY, GETDATE()), 1, 1));

SELECT * 
FROM YourTableName
WHERE YourDateColumn BETWEEN @LastDecStart AND @LastDecEnd;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:15:02