3.2 DATEDIF函数:计算两个日期的减法
【函数名称】DATEDIF
【主要功能】用于计算两个日期之间的天数、月数或年数。
【使用格式】=DATEDIF(start_date, end_date, unit)
【参数说明】
start_date参数为一个日期,它代表时间段内的第一个日期或起始日期。日期有多种输入方法:带引号的文本串(例如"2015/1/1")、系列数(例如,在1900日期系统中42005代表2015年1月1日)或其他公式或函数的结果(例如,公式=DATEVALUE("2015/1/1")的计算结果)。
end_date参数为一个日期,它代表时间段内的最后一个日期或结束日期。
unit参数为所需信息的返回类型,如下所示。
❑ "Y":时间段中的整年数。
❑ "M":时间段中的整月数。
❑ "D":时间段中的天数。
❑ "MD":start_date与end_date日期中天数的差。忽略日期中的月和年。
❑ "YM":start_date与end_date日期中月数的差。忽略日期中的日和年。
❑ "YD":start_date与end_date日期中天数的差。忽略日期中的年。
注意:
❑ 起始日期、结束日期可以为任意合法的日期格式(建议不要用“.”作为分隔符),或者单元格数值。
❑ 使用时,end_date参数的日期序列号数值一定要大于start_date参数的日期序列号数值,即end_date参数的日期一定在start_date参数的日期之后。否则,会返回错误值#NUM!。
【应用举例】
通常情况下,计算两个日期的天数,直接相减即可。在1900日期系统中,1900-1-0是虚拟的一个特殊日期,是时间日期的起点,对应序列值0。1900-1-1凌晨0点对应序列值1,即每一天对应一个序列值,单位1。1900-1-1正午12点对应序列值1.5,即时间间隔(小时、分和秒)也是同时间序列值一一对应的。于是1.25就对应1900-1-1上午6点(1代表日期是1900年1月1日,另外,1日=24小时,24*0.25=6,因此1.25就对应1900年1月1日上午6点)。
因此,很多对于日期的计算都可以转化为数值之间的计算或以此来理解。比如两个日期之间相隔的天数只要将两个日期相减就可以了。这是因为日期相减实质就是序列号相减,而序列号的单位1就等价为一天。
DATEDIF函数的主要用法如下。
1.计算两个日期之间的天数、月数或年数
❑ 如在A2单元格中录入公式:=DATEDIF("2014-5-1", "2015-10-1", "Y"),表示返回2014-5-1至2015-10-1之间的年数,返回值为1。
❑ 如在A3单元格中录入公式:=DATEDIF("2014-5-1", "2015-10-1", "M"),表示返回2014-5-1至2015-10-1之间的月数,返回值为17。
❑ 如在A4单元格中录入公式:=DATEDIF("2014-5-1", "2015-10-1", "D"),表示返回2014-5-1至2015-10-1之间的天数,返回值为518。
❑ 如在A5单元格中录入公式:=DATEDIF("2015-1-1", NOW(), "D")+1,假定今天是2015年5月18日,返回值为138,即返回今天是今年的第138天。上述公式也可替换成:=DATEDIF(DATE(2015,1,0), NOW(), "D")或=DATEDIF("2014-12-31", NOW(), "D"),同样得出正确结果。
2.计算员工的年龄
假定今天是2015年5月31日,根据员工的出生日期,快速计算员工的年龄。
已知员工的出生日期,使用DATEDIF函数和TODAY函数就可以计算出员工的年龄。如图3.3所示,在C2单元格中录入公式:=DATEDIF(B2, TODAY(), "Y"),则计算员工的出生日期至今天的年数,实际上也就是计算员工的年龄。向下复制公式,可以批量计算。
图3.3 DATEDIF函数计算员工年龄
3.计算员工的工龄
假定今天是2015年5月31日,根据员工的入职日期,快速计算员工的工龄。
已知员工的入职日期,使用DATEDIF函数和TODAY函数就可以计算出员工的工龄。如图3.4所示,在C2单元格中录入公式:=DATEDIF(B2, TODAY(), "Y"),则计算员工的入职日期至今天的年数,实际上也就是计算员工的工龄的整年数。
图3.4 DATEDIF函数计算员工工龄(年数)
上述计算员工的工龄只是粗略计算。如果需要精确到月份,假定今天是2015年5月31日,根据员工的入职日期,计算员工的准确工龄。在C2单元格中录入公式:=DATEDIF(B2, TODAY(),"Y")&"年"&IF(MONTH(NOW())>MONTH(B2), MONTH(NOW())-MONTH(B2), IF(MONTH(NOW())<MONTH(B2), MONTH(NOW())+12-MONTH(B2), IF(DAY(B2)>DAY(TODAY()),11,0)))&"个月",公式计算员工的入职日期至今天的年月数据,实际上是员工的工龄几年几个月。
公式中=DATEDIF(B2, TODAY(), "Y")&"年"返回值是员工工龄的整年数;公式后半部分IF(MONTH(NOW())>MONTH(B2), MONTH(NOW())-MONTH(B2), IF(MONTH(NOW())<MONTH(B2), MONTH(NOW())+12-MONTH(B2), IF(DAY(B2)>DAY(TODAY()),11,0)))&"个月"是计算员工工龄中的月份数,当今天的月份数大于等于员工入职的月份数时,直接用今天的月份数减去员工入职的月份数,取值为:MONTH(NOW())-MONTH(B2),得到员工工龄中的月份数据;当今天的月份数小于员工入职的月份数时,则用今天的月份数加上12个月再减去员工入职的月份数,取值为MONTH(NOW())+12-MONTH(B2),得到员工工龄中的月份数据;当今天的月份数等于员工入职的月份数时,出现两种情况,如果入职时间的日期天数大于今天日期的本月天数,则返回11;否则返回0。
最终计算出员工的工龄是“几年几个月”的结果。如表3.2所示,上述NOW函数可以用TODAY函数替代。
表3.2 DATEDIF函数精确计算员工工龄
备注:上述数据假定TODAY是2015年5月31日为基准日期的测试结果。