📥 本章配套练习册(数据已录入、写完公式自动判分):点击下载 第12章-DATEDIF函数-练习.xlsx
难度:⭐⭐⭐ | 建议用时:35 分钟 | 前置知识:第01章 TODAY
本章学习目标
- 会用 DATEDIF 计算两个日期之间相差的年数、月数、天数
- 掌握 6 个单位参数的区别(Y / M / D / YM / MD / YD)
- 会算年龄、工龄,会拼"X年X个月"这样的友好文本
一、这个函数是干什么的?
第01章学过:两个日期直接相减能得到相差的天数。但如果想问"相差几年几个月",减法就无能为力了。
DATEDIF(DATE + DIFference,日期差)专门解决这个问题,典型应用:
- HR 算工龄、算年龄
- 财务算账龄、合同剩余期限
- 项目算历时多久
⚠️ 它是一个"隐藏函数":在 Excel 的函数列表和输入提示里找不到它(输入 =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)的工龄:
|
|
结果:6
解读:TODAY() 充当结束日期,“Y” 只算整年——2020/3/15 到 2026/3/15 满 6 年,3/15 到 7/28 这段零头不足一年,舍去。
示例2:计算年龄
出生日期 2000/5/20 在 B2:
|
|
结果:26(以今天 2026/7/28 计:2026/5/20 生日已过,满 26 周岁)
解读:周岁 = “Y” 口径,生日没过就少一岁,DATEDIF 自动处理这个逻辑,比 YEAR(TODAY())-YEAR(出生日) 更准确(后者不看生日过没过,会虚增一岁)。
示例3:拼出"X年X个月"的友好文本
|
|
结果(B2 = 2020/3/15):6年4个月
解读:& 是文本连接符,把数字和文字拼起来。“Y” 出年数,“YM” 出扣除整年后的零头月数——两者搭配正好组成完整表述。
四、进阶用法
1. 合同到期提醒(组合 TODAY + IF)
合同到期日在 B2,剩余不到 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” 出零头月,用 & 拼接:
|
|
→ 6年4个月。拼接时文字都要加引号,函数不用。
第7题讲解
算"还剩几天"用 "D",且开始日期必须更早,所以 TODAY() 在前:
|
|
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 函数