1. 程式人生 > 其它 >按8小時制計算的工作時長統計函式

按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小時制統計工作時長的函式,特此將自己的解決思路分享出來,希望能幫助到其他人. 如果你和更好的解決思路 ,歡迎討論.