在Excel中计算两个日期之间的工作日小时数

时间:2018-12-03 17:48:40

标签: excel datetime excel-formula formula

我正在尝试确定这段时期内的多少 在工作时间的两个瞬间之间 (由Excel的NETWORKDAYS函数确定)。 例如,星期二11点PM之间的“工作日时间” 而接下来的星期三2点AM是3小时。 同上周五晚上11点至下午2点。 因此,如果开始时间是星期五晚上8点 并且结束时间是任何时间在星期六或星期日, 答案应该是4小时- 周末的时间间隔部分 (或假期)应忽略 (或从端到端持续时间中减去)。

该问题的底部说明了更多示例。

我在这里发现了很多东西,但是它们处理的是SQL,代码等,而在Excel中却很少。我确实找到了this,但并没有直接帮助我。

我将其用于公式:

=NETWORKDAYS(F2,G2,Q$2:Q$7)-1-MOD(F2,1)+MOD(G2,1) 

和下面是怎么回事。

Correct and incorrect

Quick check

我在这里想念什么?

3 个答案:

答案 0 :(得分:1)

对于初学者来说,您缺少明确的问题说明。 “工作日时间”是多少? 在星期五中午到星期六中午之间?

好的,我想您是在底部图片中说明

为了减少疑惑,您缺少了什么 (您出现没有注意到的内容) 是,在所有您说结果错误的示例中 (在这些情况下,), 您的开始日期/时间(Fn) 或您的结束日期/时间(Gn) 是星期六或星期日。 (尝试使用格式ddd mm-dd-yyyy h:mm:ss 而不是mm-dd-yyyy h:mm:ss。) NETWORKDAYS(Wednesday,Friday)3。 但是NETWORKDAYS(Wednesday,Saturday)NETWORKDAYS(Wednesday,Sunday) 也是3

以您的第一个示例为例:星期二:2018年7月3日15:44:16 通过 Sun 到07-08-2018 20:09:56。 NETWORKDAYS(Tuesday,Sunday)通常为4 (星期二,星期三,星期四和星期五;忽略周末), 但是NETWORKDAYS(Tuesday 07-03,Sunday 07-08)3 因为07-04假期。 因此您的公式得出3-1-(15:44:16)+(20:09:56), 或2+(20:09:56-15:44:16),或2天和4:25:40, 等于52:25:40,这就是Excel给您的。 您没有考虑到以下事实:

your_formula(Tue 07-03-2018 15:44:16, Sun 07-08-2018 20:09:56)
等于
your_formula(Tue 07-03-2018 15:44:16, Fri 07-06-2018 20:09:56)
省略了星期五 07- 06 -2018 20:09:56之间的3:50:04 和星期五07-06-2018 24:00:00 — 并且,瞧,差异是3:50:04。

第三行更加清晰, 开始日期/时间为2018年7月21日星期六 6:30:12 , 差异为6:30:12。


我基于NETWORKDAYS(some_datethe_same_date(holidays))这一事实找到了解决方案 如果日期是工作日,则为1;如果不是工作日,则为0。 所以

=NETWORKDAYS(F2,G2,Q$2:Q$7)-NETWORKDAYS(G2,G2,Q$2:Q$7)-NETWORKDAYS(F2,F2,Q$2:Q$7)*MOD(F2,1)+NETWORKDAYS(G2,G2,Q$2:Q$7)*MOD(G2,1)

将为您提供所需的结果。

答案 1 :(得分:0)

您需要考虑到间隔的开始和结束日期可能是在周末(或假日)。在这种情况下,不应应用MOD项。试试这个:

=(NETWORKDAYS(F2,G2,$Q$2:$Q$6)-IF(AND(WEEKDAY(F2,2)<6,ISNA(MATCH(INT(F2),$Q$2:$Q$6,0))),MOD(F2,1),0)+IF(AND(WEEKDAY(G2,2)<6,ISNA(MATCH(INT(G2),$Q$2:$Q$6,0))),MOD(G2,1)-1,0))

希望有帮助。

答案 2 :(得分:0)

您的公式高度依赖于控制输入数据。当前,仅当日期范围内的第一天和最后一天是工作日时,您的公式才起作用。这是由于MOD(F2,1)+MOD(G2,1)占用了您范围内第一天和最后一天的剩余时间。如果碰巧是非工作日,那么您的公式将是错误的。

将您的公式与answer here中的信息结合起来,您就可以根据自己的需求来创建公式。

这里:

=NETWORKDAYS(IF(WEEKDAY(F2)<5,F2,WORKDAY(F2,1,holidays)),IF(WEEKDAY(G2)<5,G2,WORKDAY(G2,-1,holidays)),holidays)-IF(WEEKDAY(F2,2)<6,MOD(F2,1),1)+IF(WEEKDAY(G2,2)<6,MOD(G2,1),0)

这会检查工作日范围内的第一个日期,如果不是,则移至下一个日期。然后检查工作日的结束日期,如果没有,请提前。然后,如果剩余时间恰好是工作日,请调整它们。

与之相同,它与原始公式完全相同,但增加了对日期本身的检查。对“假日”的引用可以替换为您的单元格引用。我只是为了方便起见使用了一个命名范围。

编辑:WEEKDAY(F2)<5可能需要替换为WEEKDAY(F2,2)<6,以确保您在星期一开始的工作周工作。