-
[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
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接,否则保留追究法律责任的权利
最新更新
谷歌、微软、Meta?谁才是 Python 最大的金
VB.NET编程调用讯雷下载文件
Objective-C语法之代码块(block)的使用
URL Encode
python爬虫学习
python爬虫学习——列表
go语言写http踩得坑
【Python】爬虫笔记-从PyMySQL到DBUtils
【Python】爬虫笔记-开源代理池haipproxy使用
Python规范:提高可读性
SQL Server -- 解决存储过程传入参数作为s
[SQL Server]按照设定的周别的第一天算任意
Linux下定时自动备份Docker中所有SqlServer数
链接服务器读取Mysql---出现消息 7347,级别
SQL高级(事务和触发器)
详解数仓的锁相关参数及视图
9个SQL运维常遇到的问题
sql server相关学习sql语句
读SQL进阶教程笔记05_关联子查询
读SQL进阶教程笔记04_集合运算
JavaScript 中 Object,Map,Set 及数组遍历方法
微信小程序的全局弹窗以及全局实例
理解JS函数之call,apply,bind
解决未知的服务器标记“asp:ListView”。
css样式显示省略号
浅谈JS词法环境
js对象的理解
原型和原型链的深入浅出
JavaScript实现数组对象去重
关于 NodeJs 处理超长字符串问题的分析