今天,群里有位同学问了一道问题,以前没有专门写过这种问题的解决方法,今天特地分享下我对此问题的一个思维过程,希望对大家有帮助,当然如果你有更好的方法,欢迎在留言区留言或者直接加我微信交流。
且来看下问题:
![图片[1] | 从算两个日期间隔的月份中学会的思维方式! | 星尘资源网](/wp-content/uploads/2025/09/1758525793117_0.png)
比如上面为一个员工的入职日期和离职日期,想知道这个员工工作了几个月?规则是开始时间在15号之前的(包括15号),当月算一个月,反之忽略本月不计,结束日期是15号之前的,忽略本月不计,反之当月算一个月。
求两个日期之间相隔的月份,很多同学都知道用Datedif这个函数,
=Datedif(开始时间,结束时间,“M”)。
现在加了条件,我们就不能直接使用Datedif函数了,因为该函数在求月份时是考虑了天数在内的。只能使用Month提取出两个日期中的月份来直接相减,跨年份的还要把年份间隔乘以12加上去,才是总的间隔月份。
我们先来理下底有哪些情况:
![图片[2] | 从算两个日期间隔的月份中学会的思维方式! | 星尘资源网](/wp-content/uploads/2025/09/1758525793117_1.png)
不外乎就这四种情况,结果如下:
![图片[3] | 从算两个日期间隔的月份中学会的思维方式! | 星尘资源网](/wp-content/uploads/2025/09/1758525793117_2.png)
大家仔细算算,看是不是上面的结果,比如第一条,开始时间小于15号,那就代表这个员工从10号就开始上班了,当月算一个月,结束时间为10号,半个月都不到,那么8月就忽略了,所以工作时间为5、6、7三个月。序号2中的工作时间为5、6、7、8四个月,序号3中的工作时间为6、7两个月,序号4中的工作时间为6,7,8三个月。
按照上面的逻辑,我们来写下公式:
=IF(AND(DAY(B2)15,DAY(C2),(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2)-1,(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2))))
上面三个标了黄色的地方,分别代表表里的前三种情况,这样逻辑就非常顺了。
上面是最基本的写法,我们再仔细观察下四种情况,其中第一种和第四种,算法是一样的,那是不是第一种和第四种条件可以合并在一起用OR去写呢?
=IF(OR(AND(DAY(B2)=15)),(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2),IF(AND(DAY(B2)=15),(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2)+1,(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2)-1))
第一个黄色区域表示第一种或者第四种情况,第二个黄色区域表示第二种情况,剩下就是第三种情况。
再进一步观察,
![图片[4] | 从算两个日期间隔的月份中学会的思维方式! | 星尘资源网](/wp-content/uploads/2025/09/1758525793117_3.png)
第二种和第三种情况,不是加1就是减1,结束日期对应的天数比开始日期对应的天数大,就加1,小于0就减1。
我们可以利用-1^0=1,-1^1=-1,而0和1可以用两个日期中天数大小相比较得到。
公式如下:
=IF(OR(AND(DAY(B2)=15)),(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2),(YEAR(C2)-YEAR(B2))*12+MONTH(C2)-MONTH(B2)+(-1)^(DAY(C2))
结构成了简单的单层IF了,公式也简短了很多。
有时候这样研究公式看起来很浪费时间,其实能帮助大家提高逻辑思维与发散思维的能力。
本节的分享就到这里,鹏哥祝大家每天都有进步。
从基础操作到VBA,
两杯咖啡的钱,
换取一份如此详细的Excel视频资料,
你还在犹豫?















请登录后查看评论内容