日常工作中会涉及到很多日期计算,如计算工龄、实习期、财务中的整月数结算,而这又恰恰是初学者普遍感到困难的问题。多算或者少算一个月都会产生较严重的后果!
有这个么一种情况:
2017-3-31 到 2017-4-30 实际已经是一整月了,但DATEDIF函数却认为不到一个月...
2017-1-29 到 2017-2-28 也已经有一个月了,但DATEDIF同样认为不到一个月...
DATEDIF
语法DATEDIF(起始日期,终止日期,间隔单位)当【间隔单位】为 m 时即返回两个日期之间的间隔月数,或者说间隔整月数。例:=DATEDIF("2016/2/27","2017/3/26","m")=12举例它是隐藏函数,Excel帮助文档里没有,编辑这个函数时也没有函数提示工具。
图中标绿色的行都是DATEDIF函数在统计间隔月份时出错的,C列单元格公式是直接套用DATEDIF的结果,以C2单元格为例公式如下。
=DATEDIF(A2,B2,"m")
第4行
2017/3/31 与 2017/4/30 都是月底,因此是妥妥的一个整月,但从DATEDIF函数的计算来看,似乎要等到2017/4/31日才算一个整月。可惜4月只有30号。
第5行
2017/2/28 与 2017/3/28 ,前者是月底,需要到3月31日(月底)才算一个整月,但从DATEDIF函数的计算来看,似乎因为日期都是28日所以就算一个整月了。这也太草率了吧!!估计当时开发这个函数功能的程序员看到后也会尴尬地笑笑。
第6行
2017/1/29 与 2017/2/28,后者是月底,因此即使是2017/1/31开始也已经是一整月了。而DATEDIF函数关注的显然又是日期,29大于28,所以不到1个月!
分析从上方例举我们可以看出问题都处在月底上面,而DATEDIF函数只关注了日期的 “天” 信息,忽视了对 “月底” 信息的判断,没有提高月底日期的优先级。所以要做两件:判断月底 和 提升月底优先级方法月底判断日期数据的本质是数字序列值,一天对应整数1,因此如果某个日期数据+1成为次月的1号,那么当前的这个日期就是月末。公式1=day(日期+1)=1提升月底优先级间隔月数计算时是同时考虑月和日的信息的,如果将月底数据+1,让它成为次月的日期,那么在间隔月数计算时就相当于大大提升了优先级。如:2月28日至3月29日,直接使用DATEDIF函数判断出的间隔月数为1,但如果把月底2月28日提升优先级+1变成3月1日,那么肯定不会计算成1个整月了。如果两个日期都是月底,那么两个日期都变成次月的1号,也能正常的返回间隔月份!公式2=if(day(日期+1)=1,日期+1,日期)最级方法图1中D2公式如下:=DATEDIF(IF(DAY(A2+1)=1,A2+1,A2),IF(DAY(B2+1)=1,B2+1,B2),"m")即对日期进行月底判断和提升优先级处理。