【问题标题】:Excel formula to calculate elapsed minutes between 2 date timestamps only counting minutes during work hoursExcel公式计算2个日期时间戳之间经过的分钟数,仅计算工作时间内的分钟数
【发布时间】:2020-08-07 14:09:22
【问题描述】:

我有一个包含大约 50,000 条记录的 Excel 表,我需要在其中找到两个日期时间戳之间的分钟数,但我需要排除在我们不工作期间发生的任何分钟。

我们的日程安排是周一至周五上午 8:30 至下午 5:30,周六上午 8:30 至下午 1:30 我们周日或节假日不工作。

举个例子 单元格 B2:[2020 年 7 月 3 日下午 2:16:21] 单元格 C2:[2020 年 7 月 6 日上午 9 点 20 分 23 秒] 这个手动计算的答案应该是大约 244 分钟。周五下午开始任务,周六是节假日,周日不上班,周一上午9:20任务完成。

通常,我来这里并开始写一个问题,当我充分理解自己的问题并发布一个问题时,我已经自己想通了,但这次不是!救命!

更新: @ForwardEd 分享了这个...

=((I2-H2)
-MAX(0,(NETWORKDAYS.INTL(H2,I2,"0000011",$M$2:$M$12)-1+(WEEKDAY(I2,1)=7)))*TIME(15,0,0)
-MAX(0,(NETWORKDAYS.INTL(H2,I2,"1111101",$M$2:$M$12)-(WEEKDAY(I2,1)=7)))*TIME(19,0,0)
-NETWORKDAYS.INTL(H2,I2,"1111110",$M$2:$M$12)-(NETWORKDAYS.INTL(H2,I2,"0000000")
-NETWORKDAYS.INTL(H2,I2,"0000000",$M$2:$M$12)))*24*60

其中 H:H 是开始日期时间戳,I:I 是响应日期时间戳,M2:M12 包含我的假期列表。

在我遇到这样的示例之前,它运行良好: H2 - 2020 年 7 月 26 日下午 7:48:45 I2 - 2020 年 7 月 27 日上午 8:57:58

最终结果是 -650.78333。看起来任何从某一天开始到第二天结束的东西都会以负面的形式出现。

我们希望测量需要手动核保的应用程序的平均响应时间(以分钟为单位)。这些开始时间戳是在线收到贷款申请的时间,因此它们可以在一天中的任何时间到来。停止时间是代表系统记录的响应时间的时间戳。即承销商首先对贷款申请进行处理的时间戳。如果在晚上 7 点收到贷款申请并且没有自动决定,那么我们需要在第二天开始工作时手动承销商对其进行处理。

如果该申请在周三晚上 7 点提交,并且承保人在周二上午 8:46 做出决定,我们希望为该申请记录 16 分钟 - 而不是 826 分钟,计算晚上 7 点到上午 8:30 之间的时间。

p>

【问题讨论】:

  • 你怎么知道什么时候是假期?
  • 你是怎么得到 65 分钟的?如果任务从星期五下午 2:16 pm 开始,工作日在 530 pm 结束,则有 3 小时和更改时间。那是超过65分钟。如果我的计算正确,则应该是 4 小时 4 分 2 秒,除非出现舍入误差。或 244 分钟
  • 你熟悉VBA吗?最简单的方法是制作一张每天工作时间的表格,然后使用 VBA 计算开始和结束时间之间的小时数...
  • 我想我可以帮助你
  • 让我在 30 分钟后回到你身边好吗?

标签: excel excel-formula


【解决方案1】:

您要查看的是 NETWORKDAYS.INTL。将此与自定义设置结合使用,以确定星期六、星期日的数量以及开始和结束时间之间的天数。你知道你每天有 X 个非工作时间,每个星期六有 Y 个时间。

那么你的公式本质上就变成了

(End time - start time) - X * No. Weekdays - Y * No. Saturdays - No. Sundays - No. Holidays

现在这里会有一些技巧来计算你的日子。但这就是它归结为公式的要点。

首当其冲的公式是:

工作日

NETWORKDAYS.INTL

时间

我通过使用布尔运算避免使用 if 语句,当通过数学运算符发送时,excel 将从 TRUE/FALSE 解析为 1/0。旁注:我在某处读到这也比 IF 语句更快,但无法证明这一点,并且在少量计算中确实无关紧要。

工作日

此公式将返回给定日期的星期几,并将星期几设置为 1。在此解决方案中需要确定结束日期是否为值为 7 的星期六在默认设置中以及选择选项 1 时。公式的格式为:

WORKDAY(Excel Serial date, day 1 of the week)

对于这个解决方案

WEEKDAY(B3,1)

NETWORKDAYS.INTL

此公式将用于计算开始日期和结束日期的特定天数。它可以排除自定义周末或计算自定义周。如果它提供了一个假期日期列表,它们也可以被排除在外。公式的基本格式是:

NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)

输入公式时,它会为您提供周末选择的预定义选项列表。它不会谈论模式。

模式是一个 7 位长的字符串,由 1 或 0 组成。0 代表您要计算的天数,1 是您要忽略的天数。该模式的一个重要部分是第一个条目是星期一。 “1010111”只计算周二和周四。

时间

Excel 将日期存储为整数。 1 代表 1900 年 1 月 1 日,2 代表 1900 年 1 月 2 日,依此类推。时间存储为小数,或者如果您更喜欢一天或 24 小时周期的百分比/分数。因此,与其算出数学来确定一天 X 小时数的百分比是多少,不如让 excel 为我们计算它并让稍后可能会破译公式的人更容易理解这个数字。公式的基本格式是:

TIME(Hours, Minutes, Seconds)

所以如前所述,需要确定 6 个关键组件:

  1. X - 工作日后的非工作时间
  2. Y - 星期六之后的非工作时间
  3. 工作日数
  4. 周六数
  5. 星期日数
  6. 节假日数

1) 确定工作日的非工作时间

根据提供的信息,工作日在 1730 停止并从 0830 开始。有几种计算方法。从 24 小时中减去工作时间或计算一天结束时的非工作时间,然后在一天开始时将它们添加到非工作时间中。

24 - (17.5 - 8.5) = 15

or

(24 - 17.5) + (8.5 - 0) = 15

对于本例,15 将被硬编码到最终公式中

2) 确定周六非工作时间

同上。请注意,我们忽略了星期日,因为它是指定的非工作日,我们已经知道它是 24 小时或 1 天。我们只对周六轮班结束和下一个周一正常工作开始之间的时间感兴趣。所以它真的得到了相同的计算,只是不同的班次结束时间。

24 - (13.5 - 8.5) = 19

or

(24- 13.5) - (8.5 - 0) = 19

对于本例,19 将被硬编码到最终公式中

3) 确定工作日数

根据 NETWORKDAYS.INT 之前的描述并假设假期存储在 F2:F2 范围内,并使用“0000011”模式,公式将如下所示:

=NETWORKDAYS.INTL(B2,B3,"0000011",F2)

对于此示例,公式位于单元格 F6

4) 确定周六数

类似 3) 使用“1111101”调整模式以仅选择星期六

=NETWORKDAYS.INTL(B2,B3,"1111101",F2)

对于此示例,公式位于单元格 F7

5) 确定星期日的数量

类似 4) 使用“1111110”调整模式以仅选择星期六

=NETWORKDAYS.INTL(B2,B3,"1111110",F2)

对于本例,公式位于单元格 F8

6) 确定假期数

要获得假期的数量,没有直接的方法。取而代之的是不计入节假日的所有天数与计入节假日的所有天数之间的差值。

=NETWORKDAYS.INTL(B2,B3,"0000000")-NETWORKDAYS.INTL(B2,B3,"0000000",$F$2:F2)

对于此示例,公式位于单元格 F9

现在我想说的是,只需将以上所有内容替换为通用公式,但有几个特殊情况需要注意。您可能还注意到我还没有使用 WEEKDAY 公式。

因此,为了计算 X 将应用的天数,它实际上是天数减 1。负 1 是因为您想要控制天数之间的间隔,而不是天数本身。当结束日是星期六时,这会变得有点棘手,因为那里仍然有一个间隔,但星期六不算作工作日。所以工作日间隔数的真实计数是:

=MAX(0,(F6-1+(WEEKDAY(B3,1)=7)))

我最初有 MAX(0, calc) 以防止天数为负数的可能性。在达到此最终格式后,可能不再需要它,您可能会得到以下但未经测试的结果:

=F6-1+(WEEKDAY(B3,1)=7)

同样的概念需要应用到您的星期六计数。如果您的工作在星期六结束,则不需要减去最后一个星期六之后的非工作时间。你的公式看起来像:

=MAX(0,(F7-(WEEKDAY(B3,1)=7)))

需要进一步测试以确保可以删除 MAX,但如果可以,那么公式将如下所示:

=F7-(WEEKDAY(B3,1)=7)

所以现在了解日期和时间是如何存储的,确定开始结束时间之间的时间差并减去所有非工作时间。

=(B3-B2)-MAX(0,(F6-1+(WEEKDAY(B3,1)=7)))*TIME(15,0,0)-MAX(0,(F7-(WEEKDAY(B3,1)=7)))*TIME(19,0,0)-F8-F9

现在您不想使用辅助单元格,因此您可以将每个单独的公式从 F6 带到 F9 并最终得到:

=(B3-B2)-MAX(0,(NETWORKDAYS.INTL(B2,B3,"0000011",F2)-1+(WEEKDAY(B3,1)=7)))*TIME(15,0,0)-MAX(0,(NETWORKDAYS.INTL(B2,B3,"1111101",F2)-(WEEKDAY(B3,1)=7)))*TIME(19,0,0)-NETWORKDAYS.INTL(B2,B3,"1111110",F2)-(NETWORKDAYS.INTL(B2,B3,"0000000")-NETWORKDAYS.INTL(B2,B3,"0000000",$F$2:F2))

公式看起来不规则,但分解成各个部分后更容易理解。

现在最后一步是让答案在几分钟内显示。有两种选择。

  1. 您可以将其保留为 Excel 序列日期格式,并将其格式更改为自定义格式 [m]。 [ ] 将强制它进入几分钟并防止溢出到几个小时。它也会四舍五入到最接近的分钟。

  2. 您可以通过乘以 24*60 将结果转换为分钟,该值将以分钟和分钟的小数为单位。

请注意: A11 已应用时间格式 A12 已应用常规格式 A14 应用了 [m] 的自定义格式

【讨论】:

  • 这太棒了。抱歉回复晚了,我已经不在办公室了。我今天要玩这个。这显然花了很多时间,我真的很感激。
  • 这很好用,直到我遇到这样的例子:开始 07/26/2020 7:48:45 PM 结束 07/27/2020 8:57:58 AM。最终结果为 -650.78333。看起来任何从某一天开始到第二天结束的事情都会以负面的形式出现。
  • 删除了一些 cmets 并将它们作为问题文本的一部分包含在内
  • @theteague 并且当它我今天早上关闭了那个 excel 表。我以为我已经测试了各种组合。我会研究那个,看看需要做哪些调整。不过可能要到周一。今晚我有很多事情要做,周五我忙了一整天。
【解决方案2】:

应该是这样的:

创建一个日历表,其中包含您拥有数据的一年中每一天的工作时间

日期 |开始时间 |时间结束 2020 年 1 月 1 日 2020 年 1 月 1 日晚上 8:30:00 2020 年 1 月 1 日下午 5:30:00 ... 2020 年 7 月 3 日 2020 年 7 月 3 日下午 8:30:00 2020 年 7 月 6 日下午 5:30:00 ... 2020 年 12 月 31 日

然后将此代码粘贴到模块中

Function CalcDays(dStart As Date, dEnd As Date, daysCalendar As Range)
Dim Cell As Range
Dim MinDaysCalendar As Date, MaxDaysCalendar As Date
Dim aWSF As WorksheetFunction
Set aWSF = Application.WorksheetFunction
'check the minimum en the maximum date in the calendar
With aWSF
    MinDaysCalendar = .Min(daysCalendar)
    MaxDaysCalendar = .Max(daysCalendar)
End With

'if the date you check is not in the calendar, exit the function
If dStart < MinDaysCalendar Or dStart > MaxDaysCalendar Then
    MsgBox "Date not in calendar"
    Exit Function
End If
If dEnd < MinDaysCalendar Or dEnd > MaxDaysCalendar Then
    MsgBox "date not in calendar"
    Exit Function
End If

'sum the time of all the dates between the start and the end
'pick min and max in order to start and stop at the right time per day
Dim tempTime As Integer
With daysCalendar
    For i = 1 To .Rows.Count
        If .Cells(i, 2).Value >= CLng(dStart) And .Cells(i, 3).Value <= CLng(dEnd) Then
            daytime = aWSF.Max(.Cells(i, 2).Value, dStart) - aWSF.Min(.Cells(i, 3).Value, dEnd)
        End If
        tempTime = tempTime + daytime
    Next i
End With
'return the total time
CalcDays = tempTime
End Function

您可以通过在单元格中键入 =calcdays 来调用该函数,然后将 startDay、endDay 和日历列作为参数。 这段代码可能仍然存在一些缺陷,但我认为我们可以解决这些缺陷。

【讨论】:

  • 我创建了一个名为 WorkdayCalendar 的表,它位于自己的名为 WorkdayCalendar 的选项卡上。它有 3 列,A:A = 日期,B:B=工作日开始时间,C:C = 工作日结束时间。周日和节假日除外。
  • 在单元格 J2 中我输入了 =CalcDays(H2,I2,WorkdayCalendar)
  • 也许有了新的问题信息,可以对货车进行微调?
  • 我去看看
  • 我已经解决了一些问题,请参阅this 表。我试着做一些 cmets
猜你喜欢
  • 2017-05-03
  • 1970-01-01
  • 2016-10-02
  • 2011-10-04
  • 2020-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-14
相关资源
最近更新 更多