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

database

按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

回到顶部