如何计算特定时间在多个时间间隔之间的次数(参见示例)

How do I count the number of times a specific time is between multiple time intervals (see example)

编辑:忘记添加当前公式(见post底部)

我有多个列将时间存储为间隔值(例如,晚上 10 点存储为 22,早上 6 点存储为 06)- 参见图片

我需要检查某个时间是否在所有不同的时间间隔之间

How do I write an Excel formula that checks if a time is between multiple time intervals (e.g. is 2:30AM in between 10PM and 4AM?)?

我的时间间隔存储在列中:

J5&K5 [i.e. J5 is the start (value: 02) and K5 is the end (value: 12)]
L5&M5
N5&O5
P5&Q5
R5&S5 [i.e. R5 is the start (value: 06) and K5 is the end (value: 18)]

我想查看的时间在T1:AE5

e.g. T1 = 6:30AM
e.g. U1 = 8:30AM
e.g. AD1 = 02:30AM
e.g. AE1 = 04:30AM

示例(见图): 统计AD1在中间的次数:

J5&K5 
L5&M5
N5&O5
P5&Q5
R5&S5 (i.e. R5 is the start and K5 is the end)

In this example, the count should be 3 and stored in AD5 (it's in between J5&K5, L5&M5, N5&O5)

Things to consider:

  • 00:00 and 24:00 are both stored as 24
  • Sometimes the start time is at night (e.g. 22, 24) and the end time is in the morning (e.g. 02, 04, 06)
  • Sometimes the start time is in the morning (e.g. 02 or 04) and the end time is in the afternoon (e.g. 14 or 16)

AD1 中的当前公式(无法解释 2.5 实际上在 24 和 06 之间的事实)

=SUMPRODUCT(($AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))*($AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))

^请注意,这是另一位 Whosebug 成员提供的公式,当时我在需求更改之前遇到了一个更简单的问题需要解决

好吧,这不是世界上最干净的配方,但至少它有效。我确定有办法恢复这个公式,但我对 SUMPRODUCT 很菜鸟,我找不到办法。

我明白了:

我在单元格 A3 中使用的公式是:

=SUM(IF(B7<A7;IF(Y(A1+24>=A7;A1+24<=B7+24);1;0);IF(Y(A1>=A7;A1<=B7);1;0));IF(D7<C7;IF(Y(A1+24>=C7;A1+24<=D7+24);1;0);IF(Y(A1>=C7;A1<=D7);1;0));IF(F7<E7;IF(Y(A1+24>=E7;A1+24<=F7+24);1;0);IF(Y(A1>=E7;A1<=F7);1;0));IF(H7<G7;IF(Y(A1+24>=G7;A1+24<=H7+24);1;0);IF(Y(A1>=G7;A1<=H7);1;0));IF(J7<I7;IF(Y(A1+24>=I7;A1+24<=J7+24);1;0);IF(Y(A1>=I7;A1<=J7);1;0)))

这个想法只是检查 End 是否小于 Start。如果为真,因为您使用的是 24 小时周期,则将 24 加到 End 以及要检查的值。

之后,它只是检查值是否在 StartEnd 之间。

但是,是的,很脏。我正在发布公式,希望有人可以恢复它。

但正如我所说,至少它有效。

分解你的公式:

=SUMPRODUCT(($AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))*($AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))
  • $AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))) 检查AD1是否大于开始时间

  • $AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10}))) 检查AD1是否小于结束时间

  • 然后结果相乘。由于 True 的计算结果为 1,而 False 的计算结果为 0,因此乘法运算只会在满足两个条件的情况下得出 1。

逻辑上来说:

  • AD1 大于开始时间

  • AD1 小于结束时间

所需的额外逻辑是计算以下实例:

  • AD1 大于开始时间

  • AD1 小于结束时间

同时

  • 开始时间大于结束时间

这是通过以下方式完成的:

=SUMPRODUCT((($AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))+($AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))*(INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9})))>INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))
  • $AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))) 检查AD1是否大于开始时间

  • $AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10}))) 检查AD1是否小于结束时间

  • 这次将它们加在一起(或运算)

  • INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9})))>INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10}))) 检查开始时间是否大于结束时间

  • 第三次检查与之前相加的结果相乘(AND)。这导致仅计算开始时间晚于结束时间(隔夜)的情况,其中AD1在该时间段内。


所以要计算所有需要的情况,你应该使用原始部分和新部分的总和:

=SUMPRODUCT(($AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))*($AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))+SUMPRODUCT((($AD>INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9}))))+($AD<INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))*(INDEX(J4:S4,1,N(IF(1,{1,3,5,7,9})))>INDEX(J4:S4,1,N(IF(1,{2,4,6,8,10})))))

这是使用两个 helper 行 解决问题的一种方法(如果可以的话):

The purpose of the helper rows is to find out the "true" end and start time for each start and end section using mid-day 12 as a judgement point. In other words, I have divided the time periods from 5 pairs to 10 unique time periods with its own start and end time.

要查找开始时间,请在单元格J6中输入以下公式并将其拖过;

=IF(LEFT(J3,5)="Start",J5,IF(J5<12,0,12))

要查找结束时间,请在单元格J7中输入以下公式并将其拖过;

=IF(LEFT(J3,3)="End",J5,IF(J5>12,24,12))

一个可选的步骤,你可以给范围J6:S6命名为开始,给范围J7:S7命名为 ]End,那么就可以在T5单元格中输入下面的公式来统计每个给定开始时间出现的次数:

=SUMPRODUCT((T>=Start)*(T<=End))

编辑#2

实际上可以将以上组合成一个数组公式(因此避免使用实际的辅助行)需要按Ctrl[=确认61=]+Shift+输入在公式栏完成公式后

=SUMPRODUCT((T>=IF(LEFT($J:$S,5)="Start",$J5:$S5,IF($J5:$S5<12,0,12)))*(T<=IF(LEFT($J:$S,3)="End",$J5:$S5,IF($J5:$S5>12,24,12))))

在单元格 T5 中输入以上内容,然后将其拖过。

如果您有任何问题,请告诉我。干杯:)