问题,给出的开始时间与结束时间,要去除凌晨1点到8点这个时间段。
其实这个问题有三个条件需要判断,我们把开始时间设为S,结束时间设为F
S的位置有三种:
- S<1
- 1
- S>=8
同样的F也有这三种可能性:
- F<1
- 1
- F>=8
还有一个隐含条件:
- S>F
- S<=F
因为时间跨度有的要好几天,这个时间出现在任何位置我们都要预见到。
以上的这几个条件做个笛卡尔集,我们只要认真的去分析,一个条件一个条件的去写逻辑判断就可以得到结果。
这种多条件判断,Switch函数是最好的选择,
另外还要用IF、AND、OR逻辑判断。
在提取时间和天数的运算中,我们用MOD、INT函数,因为日期时间是以天为单位:
- MOD("2019/1/1 0:30",1)得到的余数就是时间
- INT("2019/1/1 0:30“) 得到的就是天数,如果是两个日期相减,得到的就是两个日期之间的天数,去除不满24小时的时间。
具体的时间点我们用TIME函数来确定:
- 1点:TIME(1,0,0)
- 8点:TIME(8,0,0)
1点到8点的时间差,同样用TIME(7,0,0)
天数N用INT(E2-D2)来获得,那么当E2-D2小于24小时,天数为0
我们来看具体的逻辑判断:
S>=8 AND F<1
这个是最简单的一个判断,因为已经是S>F,不需要再单独做判断了。
AND(MOD(D2,1)>=TIME(8,0,0),MOD(E2,1)
结果就是INT(E2-D2)*TIME(7,0,0),天数*7个小时。
S<1 AND F>=8
这与上面的判断是一样的,也是不需要判断S与F的大小:
AND(MOD(D2,1)
INT(E2-D2+1)*TIME(7,0,0),
因为开始时间小于凌晨1点,要多加7个小时。
AND (OR( F<1,F>=8),1
经过分析,我们发现当开始时间再1点到8点之间时,结束时间不在这个时段的时候,他们的结果可以用相同的公式计算:
AND(
OR(MOD(E2,1)
结果都是用8点减去开始时间,然后加上天数乘以7小时。
AND (OR( S<1,S>=8),1
同样,当结束时间位于1点到8点,开始时间不在这个时段,我们同样可以用一个公式计算结果:
AND(
OR(MOD(D2,1)=TIME(8,0,0)),AND(MOD(E2,1)>=TIME(1,0,0),MOD(E2,1) INT(E2-D2)*TIME(7,0,0)+MOD(E2,1)-TIME(1,0,0),
结果都是用结束时间减去1点,加上天数乘7小时。
OR(AND(S<1,F<1),AND(S>=8,F>=8)
我们为了简化公式,就把这两个条件合在一起写,就是说开始与结束之间同时都在小于1点或大于8点的位置,我们就要在结果输出时,做一个S与F的大小比较,应为如果S>F,就会导致INT(E2-D2)的值少了1,我们要在结果中把这个1给补回来:
OR(
AND(MOD(D2,1)=TIME(8,0,0),MOD(E2,1)>=TIME(8,0,0))), IF(MOD(D2,1)>MOD(E2,1),
INT(E2-D2+1)*TIME(7,0,0),INT(E2-D2)*TIME(7,0,0)),
看到了么,我们INT(E2-D2+1)就是为了给他补一天。
AND(1
当开始时间与结束时间都在1到8点的区间中,我们就要在结果输出时判断S与F的大小,同样,如果S>F我们要补一天。
AND(
AND(MOD(D2,1)>=TIME(1,0,0),MOD(D2,1)=TIME(1,0,0),MOD(E2,1) IF(MOD(D2,1) INT(E2-D2)*TIME(7,0,0)+MOD(E2,1)-MOD(D2,1),INT(E2-D2+1)*TIME(7,0,0)+MOD(E2,1)-MOD(D2,1))
最后我们将所有的这些条件以及对应的结果,带入到SWITCH函数中:
=SWITCH(TRUE,
AND(MOD(D2,1)>=TIME(8,0,0),MOD(E2,1)
OR(AND(MOD(D2,1)
=TIME(8,0,0),MOD(E2,1)>=TIME(8,0,0))),IF(MOD(D2,1)>MOD(E2,1),INT(E2-D2+1)*TIME(7,0,0),INT(E2-D2)*TIME(7,0,0)), AND(MOD(D2,1)
=TIME(8,0,0)),INT(E2-D2+1)*TIME(7,0,0), AND(OR(MOD(D2,1)
=TIME(8,0,0)),AND(MOD(E2,1)>=TIME(1,0,0),MOD(E2,1) AND(OR(MOD(E2,1)
=TIME(8,0,0)),AND(MOD(D2,1)>=TIME(1,0,0),MOD(D2,1) AND(AND(MOD(D2,1)>=TIME(1,0,0),MOD(D2,1)
=TIME(1,0,0),MOD(E2,1)
就可以顺利计算出我们需要的结果了:
只有把所有的条件都考虑到才能得到正确的结果。