我正在尝试计算设备的停机时间。我只想计算特定时间段内的时间。我将此时间段称为最小和最大时间。所有时间戳都带有日期,但当日期更改时,时间应据此计算。对于一台设备,我可以做到这一点,但相同的公式不适用于下一台设备。
逻辑:时间戳是 22:00,设备的最后一个时间戳是 6:00 小时之前。 最少上午 6:00 至晚上 18:00
因此停机时间为2 小时。因为设备上次通信的时间是 16:00,停机时间考虑在 18:00。
将其分解为步骤。 我将使用
Time(6,0,0)
和 Time(18,0,0)
作为您的开始/结束时间,但您可能希望将它们设为单元格引用。 我还将使用 Min_Date
和 Max_Date
作为您要比较的 2 个时间戳
第0步:检查日期是否相同 - 如果是,则按正常计算。 否则,请继续执行以下步骤:
=MEDIAN(TIME(6,0,0), Mod(Max_Date,1), Time(18,0,0)) - MEDIAN(TIME(6,0,0), Mod(Min_Date,1), Time(18,0,0))
第 1 步: 有多少全天 停机时间? (即
2018-01-01 12:00
到 2018-01-03 12:00
有 1 全天、2018-01-02
)将此乘以每天的小时数:
=Max(Int(Max_Date)-Int(Min_Date)-1, 0) * (Time(18,0,0)-Time(6,0,0))
第 2 步: 第一天 有多少时间是停机时间?
=TIME(18,0,0)-MEDIAN(TIME(6,0,0), Mod(Min_Date,1), Time(18,0,0))
第 3 步: 最后天有多少时间是停机时间?
=MEDIAN(TIME(6,0,0), Mod(Max_Date,1), Time(18,0,0))-TIME(6,0,0)
第 4 步: 将步骤 1、2 和 3 加在一起
只需将它们结合成 1 个公式,然后 voilá。
{编辑} 将所有内容与
LET
函数放在一起:
=LET(outageStart, A1,
outageEnd, B1,
shiftStart, TIME(6,0,0),
shiftEnd, TIME(18,0,0),
IF(INT(outageStart)=INT(outageEnd),
MEDIAN(shiftStart, MOD(outageEnd,1), shiftEnd) - MEDIAN(shiftStart, MOD(outageStart,1), shiftEnd),
LET(_shiftLength, shiftEnd-shiftStart,
_outageFullDays, MAX(INT(outageEnd)-INT(outageStart)-1, 0)*_shiftLength,
_outageFirstDay, shiftEnd-MEDIAN(shiftStart, MOD(outageStart, 1), shiftEnd),
_outageLastDay, MEDIAN(shiftStart, MOD(outageEnd, 1), shiftEnd)-shiftStart,
_outageFirstDay+_outageFullDays+_outageLastDay
)
)
)
或通过反转开始/结束时间段以从全天停机中减去非停机部分来简化事情:
=LET(outageStart, A1,
outageEnd, B1,
shiftStart, TIME(6,0,0),
shiftEnd, TIME(18,0,0),
_shiftLength, shiftEnd-shiftStart,
_days, 1+INT(outageEnd)-INT(outageStart),
_inageStart, MEDIAN(shiftStart, MOD(outageStart, 1), shiftEnd)-shiftStart,
_inageEnd, shiftEnd-MEDIAN(shiftStart, MOD(outageEnd, 1), shiftEnd),
(_days*_shiftLength)-(_inageStart+_inageEnd)
)