回答博客园友的一个计算题
提问原文链接: https://q.cnblogs.com/q/136303/
如现在有一张表A,表中有两个字段,开始时间STARTTIME,结束时间ENDTIME
两个时间的值分别为:STARTTIME('2021/8/6 13:25:30'),ENDTIME('2021/8/9 10:12:30)
现在需要计算两个时间差=结束时间-开始时间'
计算结果为=0.865972222,这里去除了两天的周末,时间未满24小时
请问,用SqlServer语句怎么实现这样的效果
我给出的解决方案:
1.考虑到都是同一天,并且在周六 或者 周天, 直接返回 0
2.如果是 连续 的周六 周天, 这两者都在休息日 ,直接返回0
3.其他只要有一个不是周六 或者周天的, 进行计算时间差
1 ------------------------------------- 2 create function GetWorkDayDiff(@start datetime, @end datetime) returns decimal(15,8) 3 as 4 begin 5 --sql 中 星期 天为 周的 第一天, 星期 一为 周的第二天,星期6为周的第7天 6 --SELECT DATEPART(DW,'2021-08-14') = 7 7 --SELECT DATEPART(DW,'2021-08-15') = 1 8 9 10 if(@start>@end) 11 begin 12 --如果开始时间大于结束时间, 互换一下时间 13 declare @init_time datetime = @start; 14 set @start = @end; 15 set @end = @init_time; 16 end 17 18 declare @resultDiff decimal(15,8)=0; 19 declare @dayAllDiff decimal(15,8)=0; 20 select @dayAllDiff =DATEDIFF (ss, @start,@end)/(60*60*24*1.0000); 21 declare @t_day_start datetime = cast( convert(varchar(10),@start,120) as datetime); --格式化为 yyyy-MM-dd 格式的时间 22 declare @t_day_end datetime = cast( convert(varchar(10),@end,120) as datetime); --格式化为 yyyy-MM-dd 格式的时间 23 24 if (@t_day_start=@t_day_end ) and (DATEPART(DW,@t_day_start)=7 or DATEPART(DW,@t_day_start)=1) 25 begin 26 -- print '======================================================================================================' 27 -- print '==========开始时间和结束时间,都在同一天,并且该天是休息日, 返回 0' 28 -- print '======================================================================================================' 29 return @resultDiff; 30 end 31 else if(dateadd(day,1,@t_day_start)= @t_day_end and DATEPART(DW,@t_day_start)=7) 32 begin 33 -- print '======================================================================================================' 34 -- print '==========开始时间和结束时间是相邻的 周六周天,都是休息日,返回 0' 35 -- print '======================================================================================================' 36 return @resultDiff; 37 end 38 39 40 declare @dayOffCount decimal(15,8)=0; 41 42 while (@t_day_start<@t_day_end) 43 begin 44 set @t_day_start=dateadd(dd,1,@t_day_start); 45 if(DATEPART(DW,@t_day_start)=7 or DATEPART(DW,@t_day_start)=1) 46 begin 47 --print cast(@t_day_start as varchar(10))+' 是休息日' 48 set @dayOffCount = @dayOffCount+1; 49 end 50 --print cast(@t_day_start as varchar(10))+' 是工作日' 51 52 end 53 54 --计算两者 时间差 = 总时间差-休息日 55 set @resultDiff = @dayAllDiff-@dayOffCount 56 return @resultDiff; 57 end 58 -------------------------------------
测试代码:
declare @start datetime, @end datetime;
set @start = '2021-08-06 13:25:30';
set @end = '2021-08-09 09:12:30';
select dbo.GetWorkDayDiff(@start,@end)
本文来自博客园,作者:兴想事成,转载请注明原文链接:https://www.cnblogs.com/mjxxsc/p/15170209.html