计算不重叠的总时间[关闭]

问题描述 投票:3回答:1

标准工作时间是从08:00开始,到16:00结束,所以我为此声明了2个参数:

DECLARE @StartTime TIME = '08:00',
        @EndTime TIME = '16:00'

所有时间计算必须在开始和结束时间之间。

表1工作时间

Id      Date        WorkStartTime     WorkEndTime
-------------------------------------------------------
 1   2019/04/20     08:30            14:20
 2   2019/04/21     09:05            15:15
 3   2019/04/22     08:37            14:22
 4   2019/04/23     08:05            15:00

表2叶子

Id      Date       LeaveStartTime   LeaveEndTime    
--------------------------------------------------------
 1   2019/04/20     08:00            09:00      
 2   2019/04/21     08:30            16:00
 3   2019/04/22     07:00            08:45
 4   2019/04/22     14:20            17:00

并且按表1(工作时间)查找每天的总休假时间而不重叠(我的意思是计算休假时间(来自表2) - 工作时间(表1))

这是我需要的结果:

2019/04/20  30 min 
2019/04/21  80 min -- (35' at first and 45' at end)
2019/04/22  98 min -- (calculate 14:22(workendtime bigger than lavestarttime)   to 16:00 (for @EndTime))

我希望在SQL查询中执行此操作。我正在使用SQL Server 2016

sql sql-server
1个回答
2
投票

你的计算不清楚。对于第三行,您指定98分钟,但这会在一天开始时遗漏37分钟。

您可以在SQL Server中执行此计算。重叠的时间段有点乱,但在SQL中肯定是可能的。

以下是我认为你想要的逻辑:

select l.date,
       sum(datediff(minute, l.LeaveStartTime,
                    (case when l.LeaveStartTime < w.workStartTime then w.workStartTime else l.LeaveStartTime end)
                   ) +
           datediff(minute,
                    (case when l.LeaveEndTime > w.workEndTime then w.workEndTime else l.LeaveEndTime end),
                    l.LeaveEndTime
                   )
          ) as overlaps
from (select l.d, l.date,
             (case when LeaveStartTime < '08:00' then '08:00' else LeaveStartTime end) as LeaveStartTime,
             (case when LeaveEndTime > '16:00' then '16:00' else LeaveEndTime end) as LeaveEndTime
      from leaves l
      where LeaveEndTime > '08:00' and LeaveStartTime < '16:00'
     ) l join
     works w
     on w.date = l.date and
        (l.LeaveStartTime < w.WorkStartTime or
         l.leaveEndTime > w.workEndTime
        )
group by l.date;

Here是一个db <>小提琴。

这比大多数这样的问题更棘手,因为你不想要重叠 - 你想要留下的碎片。这需要考虑工作时间的“之前”和“之后”情况。

© www.soinside.com 2019 - 2024. All rights reserved.