[SQL Server]按照设定的周别的第一天算任意一天的周别
业务上有需求要按周五作为一周的第一天算周别,所以就研究了一个SQL Server算法。
备注:1月1号一定是第一周的开始,且到周设定的最后一天作为第一周的最后一天。WEEKDAY为SQL默认的周天为每周第一天
例如:周五当周别第一天,1月1号是周三,那么第一周的就是1月1号-1月2号,1月3号算第二周
特别说明:虽然我个人测试过多种情况,但是还是请大家使用的时候注意做好测试验证
注意事项:有类似的需求的时候,也可以用SET DATEFIRST调整SQL默认的周别第一天来解决,语法比较简单。需要注意的是:SET DATEFIRST设置是连接级的,运行的时候影响当前连接下的所有相关函数
算法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | --@i代表周几当第一天,@d代表需要判断周别的日期 DECLARE @i INT =1,@d DATETIME= '2022-01-03' DECLARE @diff INT =DATEPART(WEEKDAY,DATENAME( YEAR ,@d)+ '-01-01' )-(@i+1) SELECT CASE WHEN @diff IN (0) THEN DATEDIFF( DAY ,DATENAME( YEAR ,@d)+ '-01-01' ,@d)/7+1 WHEN @diff IN (-1,-2,-3,-4,-5,-6,-7) THEN CASE WHEN DATEDIFF( DAY ,DATEADD( DAY , ABS (@diff),DATENAME( YEAR ,@d)+ '-01-01' ),@d)<0 THEN DATEDIFF( DAY ,DATEADD( DAY , ABS (@diff),DATENAME( YEAR ,@d)+ '-01-01' ),@d)/7+1 ELSE DATEDIFF( DAY ,DATEADD( DAY , ABS (@diff),DATENAME( YEAR ,@d)+ '-01-01' ),@d)/7+1+1 END WHEN @diff IN (1,2,3,4,5,6,7) THEN CASE WHEN DATEDIFF( DAY ,DATEADD( DAY ,7-@diff,DATENAME( YEAR ,@d)+ '-01-01' ),@d)<0 THEN DATEDIFF( DAY ,DATEADD( DAY ,7-@diff,DATENAME( YEAR ,@d)+ '-01-01' ),@d)/7+1 ELSE DATEDIFF( DAY ,DATEADD( DAY ,7-@diff,DATENAME( YEAR ,@d)+ '-01-01' ),@d)/7+1+1 END END |
思路:
本文来自博客园,作者:二洋 - 博客园 (cnblogs.com),转载请注明原文链接:[SQL Server]按照设定的周别的第一天算任意一天的周别 - 二洋 - 博客园 (cnblogs.com)
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)