-
按8小时制计算的工作时长统计函数
需求:
根据结束时间和开始时间统计任务的工作时长
思路:
代码:
1 CREATE FUNCTION [dbo].[Fn_CountWorkTime_Books_V2] 2 (@startDate datetime , @endDate datetime) 3 RETURNS float 4 as 5 BEGIN 6 if(@startDate> @endDate) 7 begin 8 return 0 9 end 10 11 declare @returnValue float -- 返回结果(天) 12 declare @returnInt Int -- 返回工作时长(秒) 13 declare @startDateInt int -- 开始时间时间范围 14 declare @endDateInt int -- 结束时间时间范围 15 declare @isHolidays int -- 是否为节假日,周六日 16 declare @startDateReturn int -- 非同一天,开始当天工作时长 17 declare @endDateReturn int -- 非同一天,结束当天工作时长 18 declare @middleReturn int -- 非同一天,中间工作时长 19 20 begin 21 -- 开始时间时间范围 22 if(@startDate < DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@startDate)))) 23 begin 24 set @startDateInt = 2 25 set @startDateReturn = 8*60*60 26 end 27 else if(@startDate>= DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@startDate))) and @startDate<= DATEADD(HOUR,12,dbo.GETCURDAY(@startDate))) 28 begin 29 set @startDateInt = 2 30 set @startDateReturn = DATEDIFF(ss,@startDate,DATEADD(HOUR,12,dbo.GETCURDAY(@startDate))) + 4.5*60*60 31 end 32 else if(@startDate>DATEADD(HOUR,12,dbo.GETCURDAY(@startDate)) and @startDate< DATEADD(HOUR,13,dbo.GETCURDAY(@startDate))) 33 begin 34 set @startDateInt = 4 35 set @startDateReturn = 4.5*60*60 36 end 37 else if(@startDate>=DATEADD(HOUR,13,dbo.GETCURDAY(@startDate)) and @startDate<=DATEADD(n,30,DATEADD(HOUR,17,dbo.GETCURDAY(@startDate))) ) 38 begin 39 set @startDateInt = 4 40 set @startDateReturn = DATEDIFF(ss,@startDate,DATEADD(n,30,DATEADD(HOUR,17,dbo.GETCURDAY(@startDate)))) 41 end 42 else 43 begin 44 set @startDateInt = 4 45 set @startDateReturn = 0 46 end 47 -- 结束时间时间范围 48 if(@endDate < DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@endDate)))) 49 begin 50 set @endDateInt = 2 51 set @endDateReturn = 0 52 end 53 else if(@endDate>= DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@endDate))) and @endDate<= DATEADD(HOUR,12,dbo.GETCURDAY(@endDate))) 54 begin 55 set @endDateInt = 2 56 set @endDateReturn = DATEDIFF(ss,DATEADD(HOUR,8,dbo.GETCURDAY(@endDate)),@endDate) 57 end 58 else if(@endDate>DATEADD(HOUR,12,dbo.GETCURDAY(@endDate)) and @endDate< DATEADD(HOUR,13,dbo.GETCURDAY(@endDate))) 59 begin 60 set @endDateInt = 4 61 set @endDateReturn = 3.5*60*60 62 end 63 else if(@endDate>=DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)) and @endDate<=DATEADD(n,30,DATEADD(HOUR,17,dbo.GETCURDAY(@endDate))) ) 64 begin 65 set @endDateInt = 4 66 set @endDateReturn = DATEDIFF(ss,DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)),@endDate)+3.5*60*60 67 end 68 else 69 begin 70 set @endDateInt = 4 71 set @endDateReturn = 8*60*60 72 end 73 end 74 75 -- 判断是否为同一天 76 if(convert(varchar(10), @startDate,23) = convert(varchar(10), @endDate,23)) 77 begin 78 --判断是否为节假日 79 select @isHolidays=count(1) from 节假日配置表 where 日期=convert(varchar(10), @startDate,23) 80 if(@isHolidays!=0) 81 begin 82 set @returnInt = 0 83 end 84 else 85 begin 86 if(@startDateInt = 2 and @startDateInt=@endDateInt) 87 begin 88 -- 结束-开始 89 set @returnInt = DATEDIFF(ss,@startDate,@endDate) 90 end 91 else if(@startDateInt = 2 and @endDateInt = 4) 92 begin 93 -- (12点-开始)+(结束-13) 94 set @returnInt = DATEDIFF(ss,@startDate,DATEADD(HOUR,12,dbo.GETCURDAY(@endDate))) + DATEDIFF(ss,DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)),@endDate) 95 end 96 else 97 begin 98 -- 结束-开始 99 set @returnInt = DATEDIFF(ss,@startDate,@endDate) 100 end 101 end 102 end 103 else 104 begin 105 -- 不为同一天,工作时长=开始当天工作时长+结束当天工作时长+中间工作时长 106 -- 中间工作时长 107 declare @totalDays int 108 declare @totalUnWorkDay int 109 set @totalDays = DATEDIFF(day,@startDate,@endDate) 110 if(@totalDays > 1) 111 begin 112 select @totalUnWorkDay=count(1) from 节假日配置表 where 日期>@startDate and 日期<@endDate 113 set @middleReturn = (@totalDays-1-@totalUnWorkDay)*8*60*60 114 end 115 else 116 begin 117 set @middleReturn = 0 118 end 119 120 set @returnInt = @startDateReturn+@endDateReturn+@middleReturn 121 end 122 123 set @returnValue = cast(cast(@returnInt as float)/cast(28800 as float) as float(4)) 124 return @returnValue 125 end
出处:https://www.cnblogs.com/BetterX/p/15234496.html
ps: 网上实在是搜不到8小时制统计工作时长的函数,特此将自己的解决思路分享出来,希望能帮助到其他人. 如果你和更好的解决思路 ,欢迎讨论.
最新更新
nodejs爬虫
Python正则表达式完全指南
爬取豆瓣Top250图书数据
shp 地图文件批量添加字段
爬虫小试牛刀(爬取学校通知公告)
【python基础】函数-初识函数
【python基础】函数-返回值
HTTP请求:requests模块基础使用必知必会
Python初学者友好丨详解参数传递类型
如何有效管理爬虫流量?
SQL SERVER中递归
2个场景实例讲解GaussDB(DWS)基表统计信息估
常用的 SQL Server 关键字及其含义
动手分析SQL Server中的事务中使用的锁
openGauss内核分析:SQL by pass & 经典执行
一招教你如何高效批量导入与更新数据
天天写SQL,这些神奇的特性你知道吗?
openGauss内核分析:执行计划生成
[IM002]Navicat ODBC驱动器管理器 未发现数据
初入Sql Server 之 存储过程的简单使用
这是目前我见过最好的跨域解决方案!
减少回流与重绘
减少回流与重绘
如何使用KrpanoToolJS在浏览器切图
performance.now() 与 Date.now() 对比
一款纯 JS 实现的轻量化图片编辑器
关于开发 VS Code 插件遇到的 workbench.scm.
前端设计模式——观察者模式
前端设计模式——中介者模式
创建型-原型模式