从期间中删除停机时间后如何创建可用时间列表

How to Create a List of Available Times after removing Downtimes from a Period

我有一个网格,其中列出了期间(开始 - 结束)和停机时间列表。

然后使用以下公式对停机时间进行排序(以确保根据停机开始时间的时间顺序):

=SORT(INDIRECT("B4:C"&SUMPRODUCT(MAX((B4:B12<>"")*ROW(B4:B12)))),1)

之后我尝试计算可用时间列表(正常运行时间)。

目前我有一堆死板的公式如下:

B26=IF(B14<B15,B14,C15)

C26=IF(C14<C15,C14,B16)

B27=C16

C27=B17

我正在搜索一个通用的单元胞数组公式,或者一个可以拖动的公式 (down/across),它可以计算可用时间 (Uptimes) 的列表。

我正在寻找适用于Excel(Mac 2021)Google张。

见附图:

编辑:

这是一个 google sheet,其中包含一些示例数据和解释性注释:https://docs.google.com/spreadsheets/d/1t0XImtjP4RKeTdg3L97bjPzateUX2waHPhjf3nmSFIk/edit#gid=2100307022

在 GS 中尝试:

=FILTER(B3:C24; A3:A24="Period")

更新

B15:

=SORT(B4:C12)

B25:

=QUERY({C15:C23, B16:B24}, "where Col1 is not null and Col2 is not null")

这是我创建的解决方案(在 Excel + Google 工作表中工作)用于减少一段时间内的停机时间,只留下剩余的正常运行时间。

根据问题使用相同的单元格和范围....

原来宕机不用排序,中间排序table.

在单元格 B15 中:

=IFERROR(SORT(FILTER(B4:C12,(B4:B12<=C3)*(C4:C12>=B3))),"")

然后,为用于填充剩余正常运行时间的公式中使用的元素创建命名范围(这使公式更易于编辑,如下所述):

start为原时间段的开始时间(B14)

end为原时间段结束时间(C14)

downstart 是停机时间的开始日期时间范围 (B15:B23)

downend 是停机时间的结束日期范围 (C15:C23)

然后,对于 create/populate 剩余正常运行时间列表,对于开放时间,将此公式输入第一个单元格 (B25) 中:

=IFERROR(IF((start>=MIN(downstart))*(end<=MAX(downend)),IF(ROW()=(25+SUMPRODUCT(--(LEN(downstart)>0))-1),"",SMALL(downend,1+ROW()-25)),
IF((start>=MIN(downstart)),SMALL(downend,1+ROW()-25),
IF((end<=MAX(downend)),IF(ROW()=25,start,IF(ROW()=(25+SUMPRODUCT(--(LEN(downstart)>0))),"",SMALL(downend,ROW()-25))),
IF(ROW()=25,start,SMALL(downend,ROW()-25))
))),"")

对于结束时间,将此公式输入第一个单元格 (C25):

=IFERROR(IF((start>=MIN(downstart))*(end<=MAX(downend)),IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),"",SMALL(downstart,2+ROW()-25)),
IF((start>=MIN(downstart)),IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),end,SMALL(downstart,2+ROW()-25)),
IF((end<=MAX(downend)),IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),end,SMALL(downstart,1+ROW()-25)),
IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))),end,SMALL(downstart,1+ROW()-25))
))),"")

注意:在这两个公式中,数字 25 是要填充结果的第一行的行号,因此如果这些结果从不同的行开始,只需更改数字 25 到您的起始行。由于使用了命名范围,因此无需进行其他更改。

输入公式后,将它们都向下拖动以填充剩余的结果。

对于 Excel 2019 或更新版本(或 Google Sheets)的用户,您可以改用 IFS。对于开放时间,请使用此(在 B25 中):

=IFERROR(IFS(
(start>=MIN(downstart))*(end<=MAX(downend)),(IF(ROW()=(25+SUMPRODUCT(--(LEN(downstart)>0))-1),"",SMALL(downend,1+ROW()-25))),
(start>=MIN(downstart)),SMALL(downend,1+ROW()-25),
(end<=MAX(downend)),(IF(ROW()=25,start,IF(ROW()=(25+SUMPRODUCT(--(LEN(downstart)>0))),"",SMALL(downend,ROW()-25)))),
(start<MIN(downstart))*(end>MAX(downend)),(IF(ROW()=25,start,SMALL(downend,ROW()-25)))
),"")

并且,对于结束时间使用此(在 C25 中):

=IFERROR(IFS(
(start>=MIN(downstart))*(end<=MAX(downend)),(IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),"",SMALL(downstart,2+ROW()-25))),
(start>=MIN(downstart)),(IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),end,SMALL(downstart,2+ROW()-25))),
(end<=MAX(downend)),(IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),end,SMALL(downstart,1+ROW()-25))),
(start<MIN(downstart))*(end>MAX(downend)),(IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))),end,SMALL(downstart,1+ROW()-25)))
),"")

再次将它们向下拖动以填充其余结果。

解释:

(IF(ROW()=(25+SUMPRODUCT(--(LEN(downend)>0))-1),xxxxxx 公式的样式部分检查是否在特定行上,以便 return 特定结果

SMALL(named_range,ROW()-(25)) 公式的样式部分使用带偏移量的 ROW(25,基于此示例结果的起始行)来递增 SMALL

嵌套 IF 和 IFS 样式的解决方案都在开头问题中链接的示例文件中。