回答博客园友的一个计算题

 

提问原文链接: 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)

 

posted @ 2021-08-21 18:06  兴想事成  阅读(701)  评论(0编辑  收藏  举报