=DATEDIF(A2,B2,"M") 计算 A2 中的开始日期到 B2 中的结束日期之间相差的整月数。第三个参数是单位,决定要数什么:"Y" 数年,"M" 数月,"D" 数天,另外还有三种会忽略日期一部分的单位。
| A | B | C | D | E | |
|---|---|---|---|---|---|
| 1 | Start | End | Unit | Result | |
| 2 | 2024-04-15 | 2026-09-10 | Y | 2 | |
| 3 | M | 28 | |||
| 4 | D | 878 | |||
| 5 | YM | 4 | |||
| 6 | MD | 26 | |||
| 7 | YD | 148 |
从 2024-04-15 到 2026-09-10,共有 2 个整年、28 个整月和 878 天。改一下 B2 中的结束日期,看看每种单位的结果怎么变化。单位既可以直接写在公式里("M"),也可以像这里一样从单元格中读取。
DATEDIF 的语法和单位
=DATEDIF(start_date, end_date, unit)
| 单位 | 计算内容 | 2024-04-15 至 2026-09-10 |
|---|---|---|
"Y" | 整年数 | 2 |
"M" | 整月数 | 28 |
"D" | 天数 | 878 |
"YM" | 最后一个整年之后的月数 | 4 |
"MD" | 最后一个整月之后的天数 | 26 |
"YD" | 最后一个整年之后的天数 | 148 |
“整”的意思是 DATEDIF 从不向上取整。从 1 月 31 日到 2 月 28 日是 0 个月,因为 2 月 28 日还没满一个月。单位不区分大小写(写 "m" 也可以),但必须放在引号里或单元格中。
DATEDIF 为什么不在函数列表里
DATEDIF 是从 Lotus 1-2-3 带进 Excel 的,微软保留它只是为了兼容。“插入函数”对话框里没有它,公式自动完成不会提示它,也没有显示参数的工具提示。不过,它在 Windows 和 Mac 上的所有 Excel 版本以及 Google 表格中都能正常计算。完整输入函数名和左括号 =DATEDIF(,再自己填写参数即可。
两个日期之间的月数
大多数合同、订阅和工龄报表需要的都是整月数。如果想要带小数的结果,YEARFRAC(A2,B2)*12 会返回保留小数部分的月数(它默认的计算基准把每个月都按 30 天算)。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Start | End | Full months | Decimal months |
| 2 | 2025-03-10 | 2026-01-05 | 9 | 9.8 |
| 3 | 2024-04-15 | 2026-09-10 | 28 | 28.8 |
| 4 | 2026-01-31 | 2026-02-28 | 0 | 0.9 |
| 5 | 2025-11-01 | 2026-05-01 | 6 | 6.0 |
第一份订阅持续了 9 个整月:1 月 5 日还没到 10 日,所以第十个月不算。第三行就是 1 月 31 日的情况,结果是 0 个月。
同时计算年、月、日
"Y"、"YM" 和 "MD" 本来就是配合使用的。每个单位都从上一个单位停下的地方接着算,所以三者合起来回答的是“确切有多长”:上面那对日期相差 2 年 4 个月 26 天。计算年龄对出生日期用的也是这三种单位。
| A | B | C | D | E | F | |
|---|---|---|---|---|---|---|
| 1 | Hired | Years | Months | Days | Service | As of |
| 2 | 2019-06-03 | 7 | 3 | 27 | 7y 3m 27d | 2026-09-30 |
| 3 | 2023-11-20 | 2 | 10 | 10 | 2y 10m 10d |
截至 2026-09-30,第一位员工已经工作了 7 年 3 个月 27 天。
DATEDIF 为什么返回 #NUM!
DATEDIF 不会倒着数。开始日期晚于结束日期时,结果就是 #NUM!。如果两个日期的先后顺序不固定,就用 MIN 取较早的日期,用 MAX 取较晚的日期,再交给 DATEDIF。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Start | End | DATEDIF | With MIN and MAX |
| 2 | 2026-03-10 | 2026-01-05 | #NUM! | 64 |
#NUM! 某个数字超出了这个函数的范围。C2 显示 #NUM!,D2 返回 64。如果只要天数,=ABS(B2-A2) 不用 DATEDIF 也能得到同样的 64。遇到 "W" 这样无法识别的单位,DATEDIF 也会返回 #NUM!;如果某个日期是 Excel 无法识别为日期的文本,则返回 #VALUE!。
MD 单位可能算错
微软自己的文档都不建议使用 "MD":当开始日期的“日”在结束日期的上个月里不存在时,它可能返回负数。
| A | B | C | D | |
|---|---|---|---|---|
| 1 | Start | End | MD | D |
| 2 | 2026-01-31 | 2026-03-01 | -2 | 29 |
从 1 月 31 日到 3 月 1 日,"MD" 的结果是 -2:DATEDIF 从“2 月 31 日”开始算,而这个日期会顺延到 3 月 3 日,比结束日期晚了两天。天数 29 是对的。如果开始日期可能落在 29 日到 31 日,就用天数来表示时长,或者手动核对 MD 的结果。
练习:计算月数
| A | B | C | |
|---|---|---|---|
| 1 | Start | End | Months |
| 2 | 2025-03-10 | 2026-01-05 |
轮到你了: 在 C2 中计算 A2 中的开始日期到 B2 中的结束日期之间相差的整月数。
| A | B | C | |
|---|---|---|---|
| 1 | Date 1 | Date 2 | Days |
| 2 | 2026-04-18 | 2026-02-01 |
轮到你了: 在 C2 中计算两个日期之间相差的天数,无论哪个日期在前。
常见问题
Excel 中的 DATEDIF 函数是做什么的?
它计算两个日期之间相差的整年、整月或天数:=DATEDIF(A2,B2,"Y") 算年数,"M" 算月数,"D" 算天数。开始日期必须写在前面。
为什么在 Excel 里找不到 DATEDIF?
DATEDIF 是为了兼容 Lotus 1-2-3 而保留的,所以 Excel 没有把它放进“插入函数”对话框,公式自动完成也不会提示它。但它在所有版本中都能用:完整输入 =DATEDIF(,再自己填写参数即可。
DATEDIF 为什么返回 #NUM!?
开始日期晚于结束日期。把两个参数对调,或者在不确定哪个日期在前时使用 =DATEDIF(MIN(A2,B2),MAX(A2,B2),"D")。
DATEDIF 中的 YM、MD 和 YD 有什么区别?
它们会忽略日期的一部分:"YM" 返回去掉整年后剩下的月数,"MD" 返回去掉整月后剩下的天数,"YD" 返回去掉整年后剩下的天数。把 "Y"、"YM" 和 "MD" 组合起来,就能得到以年、月、日表示的年龄。
DATEDIF 在 Google 表格中能用吗?
能,参数和单位都一样。而且和 Excel 不同,Google 表格在函数帮助里列出了它。