在多天的特定时间段内花费的总时间

时间:2018-04-21 10:58:34

标签: excel datetime time excel-formula date-arithmetic

我遇到以下问题时遇到了困难。 我有以下excel电子表格:link

我需要一个Excel公式来计算特定时间段(20:0005:00之间,开始日期结束之间所花费的总时间日期例如:

(改为清晰:)

  

TIME SPAN:
   Start_TimeStanmp 2018/04/04 00:12:53
   End_TimeStamp 2018/04/16 13:24:04

     

每日换档:
    "Shift" Start 20:00:00
    "Shift" End 05:00:00

     

TIME DAN的总小时数是什么?

2 个答案:

答案 0 :(得分:2)

可能有一种更简单的方法,但是这个UDF应该可以解决这个问题:

Function hoursBetween(startDT As Date, stopDT As Date, timeStart As Date, timeStop As Date) As Single

    Dim dt As Date, thisStart As Date, thisStop As Date
    For dt = Int(startDT) To Int(stopDT) + IIf(timeStop < timeStart, -1, 0)

        thisStart = timeStart
        thisStop = timeStop

        If timeStart < timeStop Then
            Select Case dt
                Case Int(startDT) 'its the 1st day of the range
                    thisStart = IIf(startDT - Int(startDT) > timeStart Or (timeStart < timeStop), startDT - Int(startDT), timeStart)
                Case Int(stopDT) 'its the last day of the range
                    thisStop = IIf(stopDT - Int(stopDT) < timeStop, stopDT - Int(stopDT), timeStop)
            End Select
            Debug.Print dt & " : " & thisStart & " to " & thisStop
        Else
            'the day crosses midnight
            Select Case dt
                Case Int(startDT) 'its the 1st day of the range
                    thisStart = IIf(startDT - Int(startDT) > timeStart, timeStart, startDT - Int(startDT))
                Case Int(stopDT)  'its the last day of the range
                    thisStop = IIf(stopDT - Int(stopDT) > timeStop, timeStop, stopDT - Int(stopDT))
            End Select
        End If

        thisStart = thisStart + dt
        thisStop = thisStop + dt
        If thisStop < thisStart Then thisStop = thisStop + 1
        hoursBetween = hoursBetween + ((thisStop - thisStart) * 24)
        Debug.Print dt & " : " & thisStart & " to " & thisStop, "Day hrs: " & ((thisStop - thisStart) * 24)
    Next dt
End Function

使用您的示例进行测试:

Sub test()
    Debug.Print hoursBetween(#2018/04/04 00:12:53#, #2018/04/16 13:24:04#, #20:00#, #05:00#)
End Sub

注意&#34;不知道&#34;如果班次时间总是像你的例子一样跨越午夜,则需要两倍的代码量......(尽管有可能简化它的方法。)

04-04 : 04-04 12:12:53 to 04-04 05:00:00           Day hrs: 4.79
04-05 : 04-05 20:00:00 to 04-06 05:00:00           Day hrs: 9
04-06 : 04-06 20:00:00 to 04-07 05:00:00           Day hrs: 9
04-07 : 04-07 20:00:00 to 04-08 05:00:00           Day hrs: 9
04-08 : 04-08 20:00:00 to 04-09 05:00:00           Day hrs: 9
04-09 : 04-09 20:00:00 to 04-10 05:00:00           Day hrs: 9
04-10 : 04-10 20:00:00 to 04-11 05:00:00           Day hrs: 9
04-11 : 04-11 20:00:00 to 04-12 05:00:00           Day hrs: 9
04-12 : 04-12 20:00:00 to 04-13 05:00:00           Day hrs: 9
04-13 : 04-13 20:00:00 to 04-14 05:00:00           Day hrs: 9
04-14 : 04-14 20:00:00 to 04-15 05:00:00           Day hrs: 9
04-15 : 04-15 20:00:00 to 04-16 05:00:00           Day hrs: 9
                                                   Total: 103.7853 

答案 1 :(得分:1)

这是一个更简单/非VBA的方法,因为ashleedawg可能存在:(我将A1用作开始日期,B1用作结束日期)

&#34;棘手&#34;这里的部分是每个班次跳过午夜 - 为了纠正这个问题,我将从所有日期时间中减去开始时间(Time(20,0,0))到零。

第1步

从&#34;全天开始&#34;伯爵 - 所以,&#34; 23日至25日&#34;是&#34; 2天&#34; - 然后将其乘以&#34;每天的小时数&#34; :( MOD将自动校正班次是否越过午夜)

=(Int(B1-Time(20,0,0))-Int(A1-Time(20,0,0)))*Mod(1+Time(5,0,0)-Time(20,0,0),1)

第2步

接下来,我们需要从第一天起调整任何预启动时间。因为我们将开始时间调整为&#34; 00:00&#34;无论如何,我们只能MAX反对0 :(要获得 时间,我们使用MOD(A1,1)):

=-MAX(0, MOD(A1,1)-TIME(20,0,0))

第3步

最后,我们需要从最后一天修剪任何后期结束时间。我们将使用MIN将此时的早期时间作为截止时间:

=+MIN(Mod(1+Time(5,0,0)-Time(20,0,0),1), MOD(B1-TIME(20,0,0),1))

添加

将所有这些放入一个公式中,然后你去:

=(INT(B1-TIME(20,0,0))-INT(A1-TIME(20,0,0)))*MOD(1+TIME(5,0,0)-TIME(20,0,0),1)-MAX(0, MOD(A1,1)-TIME(20,0,0))+MIN(MOD(1+TIME(5,0,0)-TIME(20,0,0),1), MOD(B1-TIME(20,0,0),1))  

{EDIT} 您可以将TIME(20,0,0)TIME(5,0,0)更改为包含班次开始/结束时间的单元格引用。只要班次不超过24小时

,代码就可以正常工作