桓楠百科网

编程知识、经典语录与百科知识分享平台

Excel中用SWITCH函数计算时间段排除计算,免责时长

问题,给出的开始时间与结束时间,要去除凌晨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),

结果就是INT(E2-D2)*TIME(7,0,0),天数*7个小时。

S<1 AND F>=8

这与上面的判断是一样的,也是不需要判断S与F的大小:

AND(MOD(D2,1)=TIME(8,0,0)),

INT(E2-D2+1)*TIME(7,0,0),

因为开始时间小于凌晨1点,要多加7个小时。

AND (OR( F<1,F>=8),1

经过分析,我们发现当开始时间再1点到8点之间时,结束时间不在这个时段的时候,他们的结果可以用相同的公式计算:

AND(

OR(MOD(E2,1)=TIME(8,0,0)),AND(MOD(D2,1)>=TIME(1,0,0),MOD(D2,1)INT(E2-D2)*TIME(7,0,0)-MOD(D2,1)+TIME(8,0,0),

结果都是用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)

就可以顺利计算出我们需要的结果了:

只有把所有的条件都考虑到才能得到正确的结果。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言