带时分的起始日期与小时时长下,排除周末的结束日期计算方法及公式有效性咨询
嘿,你的思路其实已经摸到门道了,但咱们得仔细聊聊这个公式的潜在问题,以及更稳妥的替代方案~
先看你写的公式:=WORKDAY(INT(G20),INT(H20/24))+(MOD(G20,1)+MOD(H20/24,1))
这个公式的逻辑是把日期部分和时间部分拆分处理:
- 用
INT(G20)提取起始日期的整数部分,INT(H20/24)把小时转换成完整的天数,再用WORKDAY跳过周末计算出基础结束日期 - 然后把起始时间(
MOD(G20,1))和剩余小时转成的时间(MOD(H20/24,1))相加,补回时间部分
这个方法在大部分简单场景下是有效的,但有个关键漏洞:如果时间部分相加后超过24小时,进位的天数不会经过WORKDAY的周末校验。举个例子:
假设起始时间是周五20:00(
G20=2024/5/24 20:00),时长是8小时(H20=8)
你的公式会计算:WORKDAY(2024/5/24, 0)得到周五,时间部分20:00+8h=4:00,最终返回2024/5/25 4:00(周六,属于周末)
但实际需求应该是跳过周末,返回2024/5/27 4:00(周一)
那怎么解决这个问题呢?推荐你用更连贯的逻辑:先算出包含周末的完整结束日期时间,再自动跳过其中的周末天数。可以用下面这个公式(Excel 365/2021及以上版本支持LET函数,可读性更好):
=LET( 起始时间, G20, 总小时数, H20, 临时结束时间, 起始时间 + 总小时数/24, 周末天数, NETWORKDAYS.INTL(INT(起始时间), INT(临时结束时间), "0000011") - (INT(临时结束时间) - INT(起始时间) + 1), 最终结束时间, 临时结束时间 + 周末天数 )
如果是旧版Excel,也可以把公式展开写:
=G20+H20/24 + (NETWORKDAYS.INTL(INT(G20),INT(G20+H20/24),"0000011") - (INT(G20+H20/24)-INT(G20)+1))
这个公式的逻辑是:
- 先算出不考虑周末的临时结束时间(
起始时间 + 总小时数/24) - 用
NETWORKDAYS.INTL计算起始日期到临时结束日期之间的工作日数量,再用总天数减去工作日数量,得到这段时间内的周末天数 - 把临时结束时间加上周末天数,就自动跳过了所有周末,得到正确的工作日结束时间
另外补充一点:如果你的工作日定义不是默认的周一到周五,可以修改NETWORKDAYS.INTL里的"0000011"参数——这个字符串的每一位代表一周的一天,0是工作日,1是非工作日,从周一到周日排列。比如如果你周日也是工作日,就改成"0000001"。
总结一下:你的原始公式在时间部分不跨天的情况下是可用的,但跨天且遇到周末时会出错;上面的公式能覆盖所有场景,更靠谱~
备注:内容来源于stack exchange,提问作者Mayukh Bhattacharya

