按8小时制计算的工作时长统计函数
按8小时制计算的工作时长统计函数
需求:
根据结束时间和开始时间统计任务的工作时长
思路:
代码:
1CREATEFUNCTION[dbo].[Fn_CountWorkTime_Books_V2]2 (@startDatedatetime , @endDatedatetime)
3RETURNSfloat
4as
5BEGIN
6if(@startDate>@endDate)
7begin
8return0
9end
10
11declare@returnValuefloat-- 返回结果(天)
12declare@returnIntInt-- 返回工作时长(秒)
13declare@startDateIntint-- 开始时间时间范围
14declare@endDateIntint-- 结束时间时间范围
15declare@isHolidaysint-- 是否为节假日,周六日
16declare@startDateReturnint-- 非同一天,开始当天工作时长
17declare@endDateReturnint-- 非同一天,结束当天工作时长
18declare@middleReturnint-- 非同一天,中间工作时长
19
20begin
21-- 开始时间时间范围
22if(@startDate<DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@startDate))))
23begin
24set@startDateInt=2
25set@startDateReturn=8*60*60
26end
27elseif(@startDate>=DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@startDate))) and@startDate<=DATEADD(HOUR,12,dbo.GETCURDAY(@startDate)))
28begin
29set@startDateInt=2
30set@startDateReturn=DATEDIFF(ss,@startDate,DATEADD(HOUR,12,dbo.GETCURDAY(@startDate))) +4.5*60*60
31end
32elseif(@startDate>DATEADD(HOUR,12,dbo.GETCURDAY(@startDate)) and@startDate<DATEADD(HOUR,13,dbo.GETCURDAY(@startDate)))
33begin
34set@startDateInt=4
35set@startDateReturn=4.5*60*60
36end
37elseif(@startDate>=DATEADD(HOUR,13,dbo.GETCURDAY(@startDate)) and@startDate<=DATEADD(n,30,DATEADD(HOUR,17,dbo.GETCURDAY(@startDate))) )
38begin
39set@startDateInt=4
40set@startDateReturn=DATEDIFF(ss,@startDate,DATEADD(n,30,DATEADD(HOUR,17,dbo.GETCURDAY(@startDate))))
41end
42else
43begin
44set@startDateInt=4
45set@startDateReturn=0
46end
47-- 结束时间时间范围
48if(@endDate<DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@endDate))))
49begin
50set@endDateInt=2
51set@endDateReturn=0
52end
53elseif(@endDate>=DATEADD(n,30,DATEADD(HOUR,8,dbo.GETCURDAY(@endDate))) and@endDate<=DATEADD(HOUR,12,dbo.GETCURDAY(@endDate)))
54begin
55set@endDateInt=2
56set@endDateReturn=DATEDIFF(ss,DATEADD(HOUR,8,dbo.GETCURDAY(@endDate)),@endDate)
57end
58elseif(@endDate>DATEADD(HOUR,12,dbo.GETCURDAY(@endDate)) and@endDate<DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)))
59begin
60set@endDateInt=4
61set@endDateReturn=3.5*60*60
62end
63elseif(@endDate>=DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)) and@endDate<=DATEADD(n,30,DATEADD(HOUR,17,dbo.GETCURDAY(@endDate))) )
64begin
65set@endDateInt=4
66set@endDateReturn=DATEDIFF(ss,DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)),@endDate)+3.5*60*60
67end
68else
69begin
70set@endDateInt=4
71set@endDateReturn=8*60*60
72end
73end
74
75-- 判断是否为同一天
76if(convert(varchar(10), @startDate,23) =convert(varchar(10), @endDate,23))
77begin
78--判断是否为节假日
79select@isHolidays=count(1) from 节假日配置表 where 日期=convert(varchar(10), @startDate,23)
80if(@isHolidays!=0)
81begin
82set@returnInt=0
83end
84else
85begin
86if(@startDateInt=2and@startDateInt=@endDateInt)
87begin
88-- 结束-开始
89set@returnInt=DATEDIFF(ss,@startDate,@endDate)
90end
91elseif(@startDateInt=2and@endDateInt=4)
92begin
93-- (12点-开始)+(结束-13)
94set@returnInt=DATEDIFF(ss,@startDate,DATEADD(HOUR,12,dbo.GETCURDAY(@endDate))) +DATEDIFF(ss,DATEADD(HOUR,13,dbo.GETCURDAY(@endDate)),@endDate)
95end
96else
97begin
98-- 结束-开始
99set@returnInt=DATEDIFF(ss,@startDate,@endDate)
100end
101end
102end
103else
104begin
105-- 不为同一天,工作时长=开始当天工作时长+结束当天工作时长+中间工作时长
106-- 中间工作时长
107declare@totalDaysint
108declare@totalUnWorkDayint
109set@totalDays=DATEDIFF(day,@startDate,@endDate)
110if(@totalDays>1)
111begin
112select@totalUnWorkDay=count(1) from 节假日配置表 where 日期>@startDateand 日期<@endDate
113set@middleReturn= (@totalDays-1-@totalUnWorkDay)*8*60*60
114end
115else
116begin
117set@middleReturn=0
118end
119
120set@returnInt=@startDateReturn+@endDateReturn+@middleReturn
121end
122
123set@returnValue=cast(cast(@returnIntasfloat)/cast(28800asfloat) asfloat(4))
124return@returnValue
125end
ps: 网上实在是搜不到8小时制统计工作时长的函数,特此将自己的解决思路分享出来,希望能帮助到其他人. 如果你和更好的解决思路 ,欢迎讨论.
以上是 按8小时制计算的工作时长统计函数 的全部内容, 来源链接: utcz.com/z/535921.html