编写SQL查询获取指定年月的当月最后一天
获取指定年月的当月最后一天SQL查询方案
需求说明
根据传入的3位英文月份缩写(如'Apr'、'May')和两位年份数字(如'17'、'19'),返回该月份的最后一个日历日,格式为日/月/年(例如30/4/2017)。
解决方案(SQL Server)
以下是适配SQL Server环境的查询代码,包含年份转换、月份解析和最后日期计算的完整逻辑:
DECLARE @MONTH NVARCHAR(3) = 'Apr' DECLARE @yr_accting INT = 17 -- 转换两位年份为四位(可根据业务规则调整区间) DECLARE @full_year INT = CASE WHEN @yr_accting BETWEEN 0 AND 99 THEN CASE WHEN @yr_accting <= 29 THEN 2000 + @yr_accting ELSE 1900 + @yr_accting END ELSE @yr_accting END -- 解析英文月份缩写为数字 DECLARE @month_num INT = DATEPART(MONTH, @MONTH + ' 01 2000') -- 计算当月最后一天并格式化输出 SELECT FORMAT(EOMONTH(DATEFROMPARTS(@full_year, @month_num, 1)), 'dd/M/yyyy') AS LastDayOfMonth
关键逻辑说明
- 年份转换:针对两位年份数字,默认将
00-29映射为2000-2029,30-99映射为1930-1999,可根据实际业务需求修改CASE判断条件。 - 月份解析:通过拼接固定日期(如
2000年1月1日),利用DATEPART函数提取英文月份缩写对应的数字。 - 最后日期计算:使用
EOMONTH函数直接获取当月最后一天(SQL Server 2012及以上版本支持);若需兼容更低版本,可替换为以下写法:DECLARE @first_day DATE = DATEFROMPARTS(@full_year, @month_num, 1) DECLARE @last_day DATE = DATEADD(DAY, -1, DATEADD(MONTH, 1, @first_day))
示例验证
- 输入:
@MONTH = 'Apr',@yr_accting = 17→ 输出:30/4/2017 - 输入:
@MONTH = 'May',@yr_accting = 19→ 输出:31/5/2019 - 输入:
@MONTH = 'Nov',@yr_accting = 21→ 输出:30/11/2021
内容的提问来源于stack exchange,提问作者user12977453
相关产品推荐
相关产品推荐

