第12章:DATEDIF 函数 —— 计算两个日期的差距

计算日期差:年龄、工龄、X年X个月,隐藏函数用法

📥 本章配套练习册(数据已录入、写完公式自动判分):点击下载 第12章-DATEDIF函数-练习.xlsx

难度:⭐⭐⭐ | 建议用时:35 分钟 | 前置知识:第01章 TODAY

本章学习目标

  • 会用 DATEDIF 计算两个日期之间相差的年数、月数、天数
  • 掌握 6 个单位参数的区别(Y / M / D / YM / MD / YD)
  • 会算年龄、工龄,会拼"X年X个月"这样的友好文本

一、这个函数是干什么的?

第01章学过:两个日期直接相减能得到相差的天数。但如果想问"相差几年几个月",减法就无能为力了。

DATEDIF(DATE + DIFference,日期差)专门解决这个问题,典型应用:

  • HR 算工龄、算年龄
  • 财务算账龄、合同剩余期限
  • 项目算历时多久

⚠️ 它是一个"隐藏函数":在 Excel 的函数列表和输入提示里找不到它(输入 =DATEDIF 不会弹出参数提示),但它真实存在、完全可用。这是历史遗留原因,放心用。

二、语法结构

1
=DATEDIF(开始日期, 结束日期, 单位)
参数 说明
开始日期 较早的日期(必须 ≤ 结束日期,否则报 #NUM!
结束日期 较晚的日期,算"到今天"就用 TODAY()
单位 用哪种口径计算差距,必须加英文双引号,见下表

6 个单位参数(本章核心)

以 开始 = 2020/3/15、结束 = 2026/7/28 为例:

单位 含义 公式 结果
"Y" 整年数(不满一年不算) =DATEDIF(开始,结束,"Y") 6
"M" 总整月数 同上换"M" 76
"D" 总天数 同上换"D" 2326
"YM" 忽略年,零头的整月数 同上换"YM" 4
"MD" 忽略年和月,零头的天数 同上换"MD" 13
"YD" 忽略年,零头的天数 同上换"YD" 135

理解口诀:Y、M、D 是"总账";YM、MD、YD 是"零头"

验证零头:2020/3/15 → 2026/7/28 = 6年(Y)+ 4个月(YM)+ 13天(MD)。 从 3/15 到 7/15 正好 4 个月(YM=4),再从 7/15 到 7/28 是 13 天(MD=13)。✓

三、基础示例(手把手)

示例1:计算工龄(整年)

员工入职日期在 B2(2020/3/15),到今天(2026/7/28)的工龄:

1
=DATEDIF(B2, TODAY(), "Y")

结果:6

解读:TODAY() 充当结束日期,“Y” 只算整年——2020/3/15 到 2026/3/15 满 6 年,3/15 到 7/28 这段零头不足一年,舍去。

示例2:计算年龄

出生日期 2000/5/20 在 B2:

1
=DATEDIF(B2, TODAY(), "Y")

结果:26(以今天 2026/7/28 计:2026/5/20 生日已过,满 26 周岁)

解读:周岁 = “Y” 口径,生日没过就少一岁,DATEDIF 自动处理这个逻辑,比 YEAR(TODAY())-YEAR(出生日) 更准确(后者不看生日过没过,会虚增一岁)。

示例3:拼出"X年X个月"的友好文本

1
=DATEDIF(B2,TODAY(),"Y") & "年" & DATEDIF(B2,TODAY(),"YM") & "个月"

结果(B2 = 2020/3/15):6年4个月

解读& 是文本连接符,把数字和文字拼起来。“Y” 出年数,“YM” 出扣除整年后的零头月数——两者搭配正好组成完整表述。

四、进阶用法

1. 合同到期提醒(组合 TODAY + IF)

合同到期日在 B2,剩余不到 30 天提醒:

1
=IF(DATEDIF(TODAY(), B2, "D") <= 30, "即将到期", "正常")

注意参数顺序:TODAY() 在前(开始),到期日在后(结束)。

2. 精确工龄(用于年假计算等)

有些公司年假按"满 X 年"计算,用 "Y" 直接得到满年数即可;需要更精确时,可搭配 "YM" 算出零头月数折算。

3. “MD” 单位的已知小毛病(了解即可)

微软官方文档承认 "MD" 在个别日期组合下会算出奇怪的负数(涉及月末日期时)。日常算年龄工龄用 Y/M/D/YM 完全没问题,少用 MD 即可避开

五、常见错误与注意事项

问题 原因 解决
#NUM! 开始日期晚于结束日期(最常见!) 交换两个日期位置
#NAME? 单位没加引号写成 =DATEDIF(A2,B2,Y) 单位必须加引号 "Y"
#VALUE! 日期是文本格式(如"2020.3.15") 改成标准日期格式 2020/3/15
没有输入提示就以为函数不存在 DATEDIF 是隐藏函数 直接手写完整公式即可
结果差 1 岁 用了 YEAR 相减而不是 DATEDIF 算周岁用 "Y" 口径

六、练习题(请先独立完成)

练习数据准备

表1(员工工龄):

A B
1 姓名 入职日期
2 张三 2020/3/15
3 李四 2018/7/1
4 王五 2023/11/20

表2(年龄):

A B
6 姓名 出生日期
7 小明 2000/5/20

表3(合同):

A B
9 合同 到期日
10 合同A 2026/12/31

题目

题号 题目 在何处作答
1 计算张三的工龄(整年) C2
2 计算李四的工龄(整年) C3
3 计算王五的工龄(整年) C4
4 计算小明的周岁年龄 C7
5 计算张三入职到今天一共多少个月(总月数) D2
6 用文本拼接显示张三的工龄为"X年X个月"格式 E2
7 计算合同A距离到期还有多少天(提示:TODAY 在前,到期日在后) C10
8 思考:如果把第1题公式写成 =DATEDIF(TODAY(),B2,"Y") 会怎样?为什么? ——

说明:以下答案按"今天 = 2026/7/28"计算,你做题时日期不同,结果不同属正常。


七、练习讲解(做完再看)

第1~3题讲解

骨架相同:=DATEDIF(入职日期, TODAY(), "Y")

  • 张三 2020/3/15 → 2026/3/15 已满 6 年 → 6
  • 李四 2018/7/1 → 2026/7/1 已满 8 年(今天 7/28 已过 7/1)→ 8
  • 王五 2023/11/20 → 到 2026/7/28 还没满 3 年(要到 2026/11/20)→ 2

注意李四:入职纪念日 7/1 已过所以算 8 年;如果今天是 6/30,就还是 7 年。这就是"Y"口径"不满一年不算"的含义。

第4题讲解

=DATEDIF(B7,TODAY(),"Y"):2000/5/20 → 2026/5/20 满 26 岁,生日已过 → 26

第5题讲解

总月数用 "M"=DATEDIF(B2,TODAY(),"M")。 验证:6 年 × 12 = 72 个月,加零头 4 个月(3/15→7/15)= 76

第6题讲解

“Y” 出年、“YM” 出零头月,用 & 拼接:

1
=DATEDIF(B2,TODAY(),"Y")&"年"&DATEDIF(B2,TODAY(),"YM")&"个月"

6年4个月。拼接时文字都要加引号,函数不用。

第7题讲解

算"还剩几天"用 "D",且开始日期必须更早,所以 TODAY() 在前:

1
=DATEDIF(TODAY(), B10, "D")

2026/7/28 → 2026/12/31:7月剩 3 天 + 8月31 + 9月30 + 10月31 + 11月30 + 12月31 = 156 天。 (直接写 =B10-TODAY() 也能得到同样结果,两种方法都要会。)

第8题讲解

会报 #NUM! 错误。因为 B2(2020/3/15)早于 TODAY(),写成 DATEDIF(TODAY(),B2,...) 就是"开始晚于结束",违反规则。记住:早的日期永远放前面。


八、参考答案

题号 公式 结果(以2026/7/28为今天)
1 =DATEDIF(B2,TODAY(),"Y") 6
2 =DATEDIF(B3,TODAY(),"Y") 8
3 =DATEDIF(B4,TODAY(),"Y") 2
4 =DATEDIF(B7,TODAY(),"Y") 26
5 =DATEDIF(B2,TODAY(),"M") 76
6 =DATEDIF(B2,TODAY(),"Y")&"年"&DATEDIF(B2,TODAY(),"YM")&"个月" 6年4个月
7 =DATEDIF(TODAY(),B10,"D") 156
8 #NUM!,开始日期不能晚于结束日期 ——

本章小结

  • =DATEDIF(早日期, 晚日期, "单位")早的日期必须在前,否则 #NUM!
  • Y/M/D 算总账;YM/MD/YD 算零头;单位必须加引号
  • 算年龄工龄:"Y" + TODAY() 是黄金搭档
  • DATEDIF 是隐藏函数,没有输入提示,需要手写完整

下一章:第13章:VLOOKUP 函数

世界是你们
使用 Hugo 构建
主题 StackJimmy 设计