如何在SQL Server中无需硬编码动态获取每月最后一个周六的日期
SQL Server 动态获取当月最后一个周六实现方案
核心实现代码
以下代码无需硬编码,兼容任意@@DATEFIRST系统配置,可直接获取指定日期所在月份的最后一个周六:
-- 可替换为任意目标日期,取该日期所属月份的最后一个周六 DECLARE @TargetDate DATE = GETDATE(); DECLARE @MonthEnd DATE = EOMONTH(@TargetDate); SELECT DATEADD( DAY, - (DATEPART(WEEKDAY, @MonthEnd) + @@DATEFIRST - 1) % 7, @MonthEnd ) AS LastSaturdayOfMonth;
逻辑说明
- 先通过
EOMONTH()函数获取指定日期所在月份的最后一天,无需手动计算月份天数、拼接日期,完全无硬编码 - 偏移量计算
(DATEPART(WEEKDAY, @MonthEnd) + @@DATEFIRST - 1) % 7会自动适配实例的星期起始日配置,无论系统默认一周第一天是周日还是周一,计算结果都准确 - 如果当月最后一天本身就是周六,偏移量为0,直接返回当月最后一天,符合预期
效果验证
以提问中的2021年9月为例,运行如下代码:
DECLARE @TargetDate DATE = '2021-09-01'; DECLARE @MonthEnd DATE = EOMONTH(@TargetDate); SELECT DATEADD( DAY, - (DATEPART(WEEKDAY, @MonthEnd) + @@DATEFIRST - 1) % 7, @MonthEnd ) AS LastSaturdayOfMonth;
返回结果为2021-09-25,和示例结果完全一致。
可选封装为复用函数
如果需要频繁调用该逻辑,可封装为自定义标量函数:
CREATE FUNCTION dbo.GetLastSaturdayOfMonth(@InputDate DATE) RETURNS DATE AS BEGIN DECLARE @MonthEnd DATE = EOMONTH(@InputDate); RETURN DATEADD( DAY, - (DATEPART(WEEKDAY, @MonthEnd) + @@DATEFIRST - 1) % 7, @MonthEnd ); END GO -- 函数调用示例 SELECT dbo.GetLastSaturdayOfMonth('2021-09-15') AS LastSaturdayOfSep2021;
内容的提问来源于stack exchange,提问作者user14697114
相关产品推荐
相关产品推荐

