VB.net 2010 视频教程 VB.net 2010 视频教程 python基础视频教程
SQL Server 2008 视频教程 c#入门经典教程 Visual Basic从门到精通视频教程
当前位置:
首页 > 数据库 > T-SQL >
  • [SQL Server]按照设定的周别的第一天算任意一天的周别

业务上有需求要按周五作为一周的第一天算周别,所以就研究了一个SQL Server算法。

备注:1月1号一定是第一周的开始,且到周设定的最后一天作为第一周的最后一天。WEEKDAY为SQL默认的周天为每周第一天

例如:周五当周别第一天,1月1号是周三,那么第一周的就是1月1号-1月2号,1月3号算第二周

特别说明:虽然我个人测试过多种情况,但是还是请大家使用的时候注意做好测试验证,出现算法错误引发的后果,本人概不负责

注意事项:有类似的需求的时候,千万不要使用SQL自带的功能SET DATEFIRST来调整SQL默认的周别第一天,这个是全局设置,调整后之前数据库中已经存在算法可能就全错了

算法

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),转载请注明原文链接:https://www.cnblogs.com/stupidsheep/articles/16722618.html

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利


相关教程