【问题标题】:How to get the sum of hours worked from a range of dates?如何获得一系列日期的工作时间总和?
【发布时间】:2017-04-07 20:49:55
【问题描述】:

我有 trfdespacio 表,其中注册了操作员号码、出发日期和到达日期。

我有 trfdespacho 表,其中注册了操作员号码、出发日期和到达日期。 我想在出发日期和到达日期之间获得以小时和分钟为单位的工作时间,以便稍后获得我休息的时间。 例如注册日期为3月10日1点14分,3月10日当天9点25分结束,劳动时间为8小时11分钟。 用连续的劳动时间获得我在 1 天休息的时间, 3月10日至3月11日被要求报日期怎么办 因为我可以得到这两天的工作时间和休息时间。

我有以下内容,我只能得到我在 1 天内工作的总时间,因为我可以做更多天。

SELECT 
    D.numOperador,
(cast(SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) / 60 as varchar)  + +':'+
cast( SUM(DATEDIFF(MINUTE, D.FechaSalida, D.FechaLlegada)) % 60 AS varchar )  ) as TiempoLaborado
    FROM 
    trkOperadores O
    INNER JOIN trfDespacho D ON O.NumOperador = D.numOperador
WHERE O.NumOperador = 900200 
    AND D.FechaSalida>='2017-03-10 00:00:00.000' AND D.FechaLlegada<=DATEADD(DAY, 1, '2017-03-10 00:00:00.000') 
GROUP BY 
    D.NumOperador, FechaSalida, FechaLlegada
GO

【问题讨论】:

  • 您是否需要每天的 LaborTime 和 RestTime,例如 3 月 10 日、3 月 11 日等?或者您需要查询过滤器中给出的开始日期和结束日期之间的连续劳动和休息时间?
  • 第二个问题我需要根据查询过滤器在开始和结束日期之间连续工作和休息的时间

标签: sql sql-server


【解决方案1】:

您可以使用类似的方法来计算工作时间和非工作时间,然后使用已有的求和并将其转换为所需的 HH:MM 格式。

只是创建测试数据...

drop table #test

create table #test (depart datetime, arrive datetime)
insert into #test values ('1-1-2017 10:00:00', '1-1-2017 10:15:00')
insert into #test values ('1-1-2017 11:00:00', '1-1-2017 11:25:00')
insert into #test values ('1-1-2017 11:25:00', '1-1-2017 11:56:00')
insert into #test values ('1-2-2017 13:05:00', '1-2-2017 15:00:00')
insert into #test values ('1-3-2017 13:05:00', '1-3-2017 15:00:00')
insert into #test values ('1-3-2017 20:00:00', '1-4-2017 1:00:00')
insert into #test values ('1-4-2017 13:05:00', '1-4-2017 15:00:00')

设置你的窗口:

declare @begin datetime = '1-1-2017 00:00:00'
declare @end datetime = '1-3-2017 23:59:59'

使用lead 获取每次行程的下一个出发时间。然后使用datediff 计算出发和到达之间的时间(或窗口开始和到达,如果出发时间早于您的窗口开始)和到达或窗口结束之间的时间。

然后用datediff算出到达和下一次出发之间的时间。

; with cte as (
    select *
        , lead(depart) over (order by depart, arrive) as NextDeparture 
    from #test
    where depart between @begin and @end 
        or arrive between @begin and @end)

select *
    , datediff(minute, case when depart < @begin then @begin else depart end, case when arrive > @end then @end else arrive end) as WorkTime
    , datediff(minute, case when arrive > @end then @end else arrive end, case when arrive > @end or nextdeparture is null then @end else nextdeparture end) as NonWorkTime
from cte

注意:您也可以计算窗口的总持续时间,然后减去工作时间即可得到非工作时间。

【讨论】:

    【解决方案2】:

    这可能对你有帮助,

    DECLARE
        @FirstDate datetime,
        @LastDate datetime
    
    SELECT
        @FirstDate = '2017-03-11 00:00:00.000',
        @LastDate = '2017-03-14 00:00:00.000';
    
    With A as (
    Select '2017-03-10 09:00:00.000' as S, '2017-03-10 17:00:00.000' as E union 
    Select '2017-03-11 09:00:00.000' as S, '2017-03-11 17:00:00.000' as E union 
    Select '2017-03-12 09:00:00.000' as S, '2017-03-12 17:00:00.000' as E union 
    Select '2017-03-13 09:00:00.000' as S, '2017-03-13 17:00:00.000' as E union 
    Select '2017-03-14 09:00:00.000' as S, '2017-03-14 17:00:00.000' as E 
    )
    
    Select 
    Sum(DATEDIFF(minute, S, E)) as [Worked Minutes], 
    DATEDIFF(minute, @FirstDate, @LastDate) as [Total Duration in Minutes], 
    DATEDIFF(minute, @FirstDate, @LastDate) - Sum(DATEDIFF(minute, S, E)) as [Rested Minutes]
    -- You need to convert the rested minutes to hours and probably in days if it exeeds the 24 hours limit
    from A 
    Where S >= @FirstDate and E <= @LastDate
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-11-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-04
      • 2012-10-05
      相关资源
      最近更新 更多