文章详情

短信预约信息系统项目管理师 报名、考试、查分时间动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

按8小时制计算的工作时长统计函数

2022-02-13 17:58

关注

按8小时制计算的工作时长统计函数

按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

 

 

ps: 网上实在是搜不到8小时制统计工作时长的函数,特此将自己的解决思路分享出来,希望能帮助到其他人. 如果你和更好的解决思路 ,欢迎讨论.

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-数据库
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯