eomonth直接返回指定日期所在月最后一天,自动处理大小月、闰年及跨年;基本用法为eomonth(start_date[, months_to_add]),支持正负整数偏移,输入字符串需显式转换,sql server 2012+专用。

EOMONTH 直接返回指定日期所在月份的最后一天,不需要手动计算天数或处理闰年。
基本用法:传入一个日期参数就能得到月末日
最常见场景是获取当前月最后一天:EOMONTH(GETDATE())。它接受一个 date、datetime 或兼容类型(如 datetime2)作为第一个参数,返回同类型值。
- 如果传入
'2024-02-15',返回'2024-02-29'(自动适配闰年) - 支持偏移量:第二个可选参数为整数,表示向后或向前推几个月,比如
EOMONTH(GETDATE(), 1)返回下个月末 - 注意:偏移量为负数时也有效,
EOMONTH(GETDATE(), -1)是上个月最后一天
常见错误:把字符串直接当日期传进去却没转换
如果写成 EOMONTH('2024-02'),SQL Server 会尝试隐式转换,但可能失败或结果意外——尤其在 CONVERT 模式不匹配或语言设置影响下。
- 安全做法是显式转换:
EOMONTH(CAST('2024-02-01' AS DATE)) - 避免只传年月字符串,比如
'2024-02',因为不同版本 SQL Server 对其解析行为不一致 - 若从变量取值,确保变量类型是
date或datetime,而非varchar
替代方案对比:为什么不用 DATEADD + DAY + -1?
老写法常是 DATEADD(DAY, -1, DATEADD(MONTH, 1, DATEFROMPARTS(YEAR(@d), MONTH(@d), 1))),逻辑绕且易错。
-
EOMONTH更简洁、可读性强,且内置处理了所有边界情况(如 12 月跨年、2 月天数) - 性能上无明显差异,但维护成本低得多;SQL Server 2012+ 原生支持,无需兼容旧版本时没必要绕路
- 如果目标实例是 SQL Server 2008 或更早,则确实不能用
EOMONTH,得退回手动计算
真正容易被忽略的是偏移量参数的符号方向:正数 = 向未来推月,负数 = 向过去推,不是“加减天数”。另外,EOMONTH 返回的日期时间部分始终是 00:00:00,如果原输入带时间,结果也会归零——这点在做范围查询时得留意是否要保留原始时间精度。











