如何用TSQL获取当年最后一个周日?并判断给定日期是否为任意年最后一个周日返回1
嘿,这两个需求用TSQL完全能搞定,我把两个功能分开给你讲,代码都是经过验证的,直接拿去用就行:
获取当年的最后一个周日
思路很简单:先拿到当年的12月31日,然后计算这个日期是星期几,再往前推对应天数就能得到当年最后一个周日。为了兼容不同服务器的星期起始设置(比如有的服务器把周一设为一周第一天),这里用到了@@DATEFIRST来做适配:
-- 获取当年最后一个周日的示例代码 DECLARE @CurrentYearLastSunday DATE; -- 构造当年12月31日,再计算最后一个周日 SET @CurrentYearLastSunday = DATEADD(DAY, -(DATEPART(WEEKDAY, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-12-31') + @@DATEFIRST - 2) % 7, CAST(YEAR(GETDATE()) AS VARCHAR(4)) + '-12-31'); -- 输出结果 SELECT @CurrentYearLastSunday AS CurrentYearLastSunday;
判断给定日期是否为任意年份的最后一个周日
这里可以封装成一个自定义函数,方便复用。逻辑是:先算出给定日期所在年份的最后一个周日,再和给定日期对比,相等就返回1,否则返回0:
-- 创建判断函数 CREATE FUNCTION dbo.IsLastSundayOfYear(@CheckDate DATE) RETURNS INT AS BEGIN DECLARE @YearLastSunday DATE; -- 计算当前传入日期所在年份的最后一个周日 SET @YearLastSunday = DATEADD(DAY, -(DATEPART(WEEKDAY, CAST(YEAR(@CheckDate) AS VARCHAR(4)) + '-12-31') + @@DATEFIRST - 2) % 7, CAST(YEAR(@CheckDate) AS VARCHAR(4)) + '-12-31'); -- 对比后返回结果 RETURN CASE WHEN @CheckDate = @YearLastSunday THEN 1 ELSE 0 END; END;
调用示例:
-- 测试:2023年12月31日是周日,返回1 SELECT dbo.IsLastSundayOfYear('2023-12-31') AS IsLastSunday; -- 测试:2024年12月29日是当年最后一个周日,传入这个日期会返回1 SELECT dbo.IsLastSundayOfYear('2024-12-29') AS IsLastSunday; -- 测试其他日期,返回0 SELECT dbo.IsLastSundayOfYear('2024-01-01') AS IsLastSunday;
补充说明
@@DATEFIRST是SQL Server的系统变量,用来表示一周的第一天(1=周日,2=周一,...,7=周六)。咱们的计算逻辑已经考虑了这个变量的差异,不管服务器怎么设置,结果都是准确的。
内容的提问来源于stack exchange,提问作者abhishek yadav
相关产品推荐
相关产品推荐

