zoukankan      html  css  js  c++  java
  • 回答博客园友的一个计算题

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

  • 相关阅读:
    Spring boot unable to determine jdbc url from datasouce
    Unable to create initial connections of pool. spring boot mysql
    spring boot MySQL Public Key Retrieval is not allowed
    spring boot no identifier specified for entity
    Establishing SSL connection without server's identity verification is not recommended
    eclipse unable to start within 45 seconds
    Oracle 数据库,远程访问 ora-12541:TNS:无监听程序
    macOS 下安装tomcat
    在macOS 上添加 JAVA_HOME 环境变量
    Maven2: Missing artifact but jars are in place
  • 原文地址:https://www.cnblogs.com/mjxxsc/p/15170209.html
Copyright © 2011-2022 走看看