我正在尝试查找开始和停止日期/时间范围之间以分钟为单位计算的任何间隙。 本质上是日程安排中没有预约的时间,这是 24 小时服务,我正在寻找办公室里没有客户的“死”时间。
目前,我正在尝试使用
=SUMPRODUCT((A2<B$2:B$19)*(B2>A$2:A$19))>1
来查找重叠,我遇到的问题是,如果开始或停止中有任何重叠,则它会取消资格,并且不能真正识别约会之间的空间,只要该约会在全部。
这是针对此问题的新版本的 Gap 和 Island 解决方案,使用 Excel 365 功能:
=LET(start,A2:A19,
end,B2:B19,
row,SEQUENCE(ROWS(start)),
maxSoFar,SCAN(0,row,LAMBDA(a,c,IF(c=1,INDEX(start,1),IF(INDEX(end,c-1)>a,INDEX(end,c-1),a)))),
SUM(IF(start>maxSoFar,start-maxSoFar,0)))
算法很简单:
- Sort data by start time if necessary, then for each pair of times:
- Record the latest finish time so far (maxSoFar) (not including the present appointment)
- If the start time (start) is greater than maxSoFar, add start-maxSoFar to the total.
第一个时间间隔是一种特殊情况 - 将 maxSoFar 初始化为第一个开始时间。
可以看到预约只有两个间隙,从4:15到7:31(3小时16分钟)和从11:48到14:17(3小时29分钟)总共5小时45分钟。
为什么我不直接使用 Max 来缩短代码呢?我不知道:
=LET(start,A2:A19,
end,B2:B19,
row,SEQUENCE(ROWS(start)),
maxSoFar,SCAN(0,row,LAMBDA(a,c,IF(c=1,INDEX(start,1),MAX(INDEX(end,c-1),a)))),
SUM(IF(start>maxSoFar,start-maxSoFar,0)))
注意
这个答案的前提是数据必须按照开始时间升序排序。如果不是这种情况,您可以添加排序:
=LET(start,SORT(A2:A19),
end,SORTBY(B2:B7,A2:A19),
row,SEQUENCE(ROWS(start)),
maxSoFar,SCAN(0,row,LAMBDA(a,c,IF(c=1,INDEX(start,1),MAX(INDEX(end,c-1),a)))),
SUM(IF(start>maxSoFar,start-maxSoFar,0)))
要查找日程中约会之间的间隔,您可以尝试使用以下公式:
=SUM(B2:B19)-SUMPRODUCT((A2<B$2:B$19)*(B2>A$2:A$19))
然后,您可以将结果乘以 1440(一天中的分钟数),将持续时间转换为分钟。
=1440*(SUM(B2:B19)-SUMPRODUCT((A2<B$2:B$19)*(B2>A$2:A$19)))