如何获取上一年的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
相关产品推荐
相关产品推荐

