Excel公式计算两个日期时间戳之间的已用分钟数,仅计算工作时间内的分钟数

Excel公式计算两个日期时间戳之间的已用分钟数,仅计算工作时间内的分钟数,excel,excel-formula,Excel,Excel Formula,我有一个excel表格,其中有大约50000条记录,我需要找到两个日期时间戳之间的分钟数,但我需要排除我们不工作期间发生的任何分钟数 我们的日程安排是M-F 8:30am-5:30pm,周六8:30am-1:30pm 我们星期天或假日不工作 例如 B2单元:[7/3/2020 2:16:21下午] C2单元:[7/6/2020 9:20:23 AM] 对于这个问题,人工计算的答案应该是244分钟左右。任务开始于周五下午,周六是节假日,周日不上班,任务完成于周一上午9:20 通常,我来这里开始写一

我有一个excel表格,其中有大约50000条记录,我需要找到两个日期时间戳之间的分钟数,但我需要排除我们不工作期间发生的任何分钟数

我们的日程安排是M-F 8:30am-5:30pm,周六8:30am-1:30pm 我们星期天或假日不工作

例如 B2单元:[7/3/2020 2:16:21下午] C2单元:[7/6/2020 9:20:23 AM] 对于这个问题,人工计算的答案应该是244分钟左右。任务开始于周五下午,周六是节假日,周日不上班,任务完成于周一上午9:20

通常,我来这里开始写一个问题,当我对自己的问题理解得足够好,可以发布一个问题时,我已经自己解决了,但这次不行!救命啊

更新: @转发共享此

=((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-07/26/2020下午7:48:45 I2-07/27/2020上午8:57:58

净结果为-650.78333。看起来,任何一天开始,第二天结束的事情都会以负面的形式出现

我们希望测量需要手动承保的应用程序的平均响应时间(以分钟为单位)。这些开始时间戳是在线接收贷款申请的时间,以便他们可以在一天中的任何时间到来。停止时间是表示系统记录的响应时间的时间戳。i、 e.承销商首次对贷款申请采取行动的时间戳。如果贷款申请是在晚上7点收到的,并且不是自动决定的,那么在我们开始工作的第二天,手动承销商将需要对其进行处理


如果该申请在周三晚上7点提交,并且由保险商在周二上午8:46作出决定,我们将为该申请记录16分钟,而不是826分钟,这不包括晚上7点到上午8:30之间的时间。

您想要查看的是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。在这个解决方案中,当选择选项1时,需要确定结束日期是否是默认设置值为7的星期六。公式的格式为:

WORKDAY(Excel Serial date, day 1 of the week)
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
TIME(Hours, Minutes, Seconds)
对于此解决方案

WEEKDAY(B3,1)
NETWORKDAYS.INTL 此公式将用于计算开始日期和结束日期的特定天数。它可以排除自定义周末或计算自定义周。如果提供了假日日期列表,也可以将其排除在外。公式的基本格式为:

WORKDAY(Excel Serial date, day 1 of the week)
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
TIME(Hours, Minutes, Seconds)
当输入公式时,它将为您提供一个周末选择的预定义选项列表。它不会谈论模式

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

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

WORKDAY(Excel Serial date, day 1 of the week)
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
TIME(Hours, Minutes, Seconds)
如前所述,需要确定6个关键组件:

X-工作日后的非工作时间量 Y-周六后的非工作时间 工作日数 星期六的数目 星期日数 假期数 1确定工作日非工作时间 根据提供的信息,工作日在1730点停止,从0830点开始。做数学题有两种方法。从24小时中减去工作时间或计算非工作时间 一天结束时的k小时,并在一天开始时将其添加到非工作时间

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使用11111 01将模式调整为仅选择星期六

=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中

在这一点上,我想说的是,将上述所有内容代入通用公式,但有几个特殊情况需要注意。您可能还注意到我还没有使用工作日公式

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

=MAX(0,(F6-1+(WEEKDAY(B3,1)=7)))
我最初在那里有MAX0,calc,以防止日计数可能为负。在达到此最终格式后,可能不需要它,您可能会忽略以下内容,但未经测试:

=F6-1+(WEEKDAY(B3,1)=7)
同样的概念也需要应用到你的星期六计数中。如果你的工作在周六结束,你不需要减去上周六之后的非工作时间。您的公式将如下所示:

=MAX(0,(F7-(WEEKDAY(B3,1)=7)))
=F7-(WEEKDAY(B3,1)=7)
此外,还需要进一步测试,以确保可以删除MAX,但如果可以,则公式如下所示:

=MAX(0,(F7-(WEEKDAY(B3,1)=7)))
=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))
这个公式看起来难以控制,但分解成几个部分后更容易理解

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

您可以将其保留为excel序列日期格式,并将的格式更改为自定义格式[m]。[]将强制它持续几分钟,并防止泄漏持续几小时。它也将转到最近的一分钟

您可以通过乘以24*60将结果转换为分钟,数值将以分钟为单位,以分钟为小数点

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

您要查看的是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。在这个解决方案中,当选择选项1时,需要确定结束日期是否是默认设置值为7的星期六。公式的格式为:

WORKDAY(Excel Serial date, day 1 of the week)
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
TIME(Hours, Minutes, Seconds)
对于此解决方案

WEEKDAY(B3,1)
NETWORKDAYS.INTL 此公式将用于计算开始日期和结束日期的特定天数。它可以排除自定义周末或计算自定义周。如果提供了假日日期列表,也可以将其排除在外。公式的基本格式为:

WORKDAY(Excel Serial date, day 1 of the week)
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
TIME(Hours, Minutes, Seconds)
当输入公式时,它将为您提供一个周末选择的预定义选项列表。它不会谈论模式

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

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

WORKDAY(Excel Serial date, day 1 of the week)
NETWORKDAYS.INTL(Start Date, End Date, Custom week choice or workweek pattern, range of holiday dates)
TIME(Hours, Minutes, Seconds)
如前所述,需要确定6个关键组件:

X-工作日后的非工作时间量 Y-周六后的非工作时间 工作日数 星期六的数目 星期日数 假期数 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使用11111 01将模式调整为仅选择星期六

=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中

在这一点上,我想说的是,将上述所有内容代入通用公式,但有几个特殊情况需要注意。您可能还注意到我还没有使用工作日公式

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

=MAX(0,(F6-1+(WEEKDAY(B3,1)=7)))
我最初在那里有MAX0,calc,以防止日计数可能为负。在达到此最终格式后,可能不需要它,您可能会忽略以下内容,但未经测试:

=F6-1+(WEEKDAY(B3,1)=7)
同样的概念也需要应用到你的星期六计数中。如果你的工作在周六结束,你不需要减去上周六之后的非工作时间。您的公式将如下所示:

=MAX(0,(F7-(WEEKDAY(B3,1)=7)))
=F7-(WEEKDAY(B3,1)=7)
此外,还需要进一步测试,以确保可以删除MAX,但如果可以,则公式如下所示:

=MAX(0,(F7-(WEEKDAY(B3,1)=7)))
=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))
这个公式看起来难以控制,但分解成几个部分后更容易理解

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

您可以将其保留为excel序列日期格式,并将的格式更改为cu [m]的stom格式。[]将强制它持续几分钟,并防止泄漏持续几小时。它也将转到最近的一分钟

您可以通过乘以24*60将结果转换为分钟,数值将以分钟为单位,以分钟为小数点

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

它应该是这样的:

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

日期|开始时间|结束时间 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和calendar列作为参数。
这段代码中可能仍然存在一些缺陷,但我认为我们可以处理这些缺陷。

应该是这样的:

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

日期|开始时间|结束时间 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和calendar列作为参数。

这段代码中可能仍有一些缺陷,但我认为我们可以解决这些问题。

你怎么知道什么时候是假日?你怎么能得到65分钟?如果任务在周五下午2:16开始,工作日在下午530结束,则有3小时的时间和更改时间。这是超过65分钟的方式。如果我计算正确的话,除了舍入误差,应该是4小时4分2秒。或者244分钟你熟悉VBA吗?最简单的方法是制作一张包含每天工作时间的表格,然后使用VBA计算开始时间和结束时间之间的时间…我想我可以帮助你在30分钟内让我回到你身边好吗?你怎么知道什么时候是假期?你怎么得到65分钟?如果任务在周五下午2:16开始,工作日在下午530结束,则有3小时的时间和更改时间。这是超过65分钟的方式。如果我计算正确的话,除了舍入误差,应该是4小时4分2秒。或者244分钟你熟悉VBA吗?最简单的方法是制作一张包含每天工作时间的表格,然后使用VBA计算开始时间和结束时间之间的小时数…我想我可以帮助你在30分钟内让我回到你身边,好吗?这太棒了。抱歉耽误了回复,我不在办公室。我今天要玩这个。这显然花了很多时间,我真的很感激。这非常有效,直到我遇到这样一个例子:开始07/26/2020 7:48:45 PM结束07/27/2020 8:57:58 AM。净结果为-650.78333。似乎任何一天开始到第二天结束的事情都会以负面的形式出现。删除了一些评论,并将其作为问题的一部分包含在内text@theteague该死的,我今天早上就把excel表格关了。我想我已经测试了各种组合。我将研究这一点,看看需要做什么调整。但可能要到星期一。我今晚有一大堆事情要做,周五一整天都很忙。这太棒了。抱歉耽误了回复,我不在办公室。我今天要玩这个。这显然花了很多时间,我真的很感激。这非常有效,直到我遇到这样一个例子:开始07/26/2020 7:48:45 PM结束07/27/2020 8:57:58 AM。净结果为-650.78333。似乎任何一天开始到第二天结束的事情都会以负面的形式出现。删除了一些评论,并将其作为问题的一部分包含在内text@theteague该死的,我今天早上就把excel表格关了。我想我已经测试了各种组合。我将研究这一点,看看需要做什么调整。但可能要到星期一。我今晚有一大堆事情要做,周五一整天都很忙。我创建了一个名为WorkdayCalendar的表,它位于自己的名为WorkdayCalendar的选项卡上。它有3列,A:A=日期,B:B=工作日开始时间,C:C=工作日结束时间。周日和节假日都不包括在内。在单元格J2中,我输入了=CalcDaysH2,I2,WorkdayScalendar。如果问题中有新的信息,货车可以微调吗?我来看看我已经解决了一些问题,请参阅工作表。我试图做一些评论。我创建了一个名为WorkdayCalendar的表,它位于自己的名为WorkdayCalendar的选项卡上。它有3列,A:A=日期,B:B=工作日开始时间,C:C=工作日结束时间。周日和节假日都不包括在内。在单元格J2中,我输入了=CalcDaysH2,I2,WorkdayScalendar。如果问题中有新的信息,货车可以微调吗?我来看看我已经解决了一些问题,请参阅工作表。我试着做一些com 门厅