在最新一屆國際資料庫頂級會議 ACM SIGMOD 2022 上,來自清華大學的李國良和張超兩位老師發表了一篇論文:《HTAP Database: What is New and What is Next》,並做了 《HTAP Database:A Tutorial》 的專項報告。這幾期學術分享會的 ...
業務上有需求要按周五作為一周的第一天算周別,所以就研究了一個SQL Server演算法。
備註:1月1號一定是第一周的開始,且到周設定的最後一天作為第一周的最後一天。WEEKDAY為SQL預設的周天為每周第一天
例如:周五當周別第一天,1月1號是周三,那麼第一周的就是1月1號-1月2號,1月3號算第二周
特別說明:雖然我個人測試過多種情況,但是還是請大家使用的時候註意做好測試驗證,出現演算法錯誤引發的後果,本人概不負責
註意事項:有類似的需求的時候,千萬不要使用SQL自帶的功能SET DATEFIRST來調整SQL預設的周別第一天,這個是全局設置,調整後之前資料庫中已經存在演算法可能就全錯了
演算法:
--@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)
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文鏈接,否則保留追究法律責任的權利