如何计算特定时间在多个时间间隔之间的次数(参见示例)
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
以及要检查的值。
之后,它只是检查值是否在 Start
和 End
之间。
但是,是的,很脏。我正在发布公式,希望有人可以恢复它。
但正如我所说,至少它有效。
分解你的公式:
=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
中输入以上内容,然后将其拖过。
如果您有任何问题,请告诉我。干杯:)
编辑:忘记添加当前公式(见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
以及要检查的值。
之后,它只是检查值是否在 Start
和 End
之间。
但是,是的,很脏。我正在发布公式,希望有人可以恢复它。
但正如我所说,至少它有效。
分解你的公式:
=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
中输入以上内容,然后将其拖过。
如果您有任何问题,请告诉我。干杯:)