Menu

Excel DATEDIF 函数:计算两个日期相差的年、月、日

=DATEDIF(A2,B2,"M") 计算 A2 中的开始日期到 B2 中的结束日期之间相差的整月数。本文讲解 Y、M、D、YM、MD 和 YD 六种单位,DATEDIF 为什么不在函数列表里,以及 #NUM! 错误。

本页的每张表格都是实时的:修改数字或公式,就会重新计算。

=DATEDIF(A2,B2,"M") 计算 A2 中的开始日期到 B2 中的结束日期之间相差的整月数。第三个参数是单位,决定要数什么:"Y" 数年,"M" 数月,"D" 数天,另外还有三种会忽略日期一部分的单位。

同一对日期下的所有 DATEDIF 单位
E3
ABCDE
1StartEndUnitResult
22024-04-152026-09-10Y2
3M28
4D878
5YM4
6MD26
7YD148
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

从 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 天算)。

每份订阅的月数
C2
ABCD
1StartEndFull monthsDecimal months
22025-03-102026-01-0599.8
32024-04-152026-09-102828.8
42026-01-312026-02-2800.9
52025-11-012026-05-0166.0
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

第一份订阅持续了 9 个整月:1 月 5 日还没到 10 日,所以第十个月不算。第三行就是 1 月 31 日的情况,结果是 0 个月。

同时计算年、月、日

"Y"、"YM" 和 "MD" 本来就是配合使用的。每个单位都从上一个单位停下的地方接着算,所以三者合起来回答的是“确切有多长”:上面那对日期相差 2 年 4 个月 26 天。计算年龄对出生日期用的也是这三种单位。

工龄
E2
ABCDEF
1HiredYearsMonthsDaysServiceAs of
22019-06-0373277y 3m 27d2026-09-30
32023-11-20210102y 10m 10d
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

截至 2026-09-30,第一位员工已经工作了 7 年 3 个月 27 天。

DATEDIF 为什么返回 #NUM!

DATEDIF 不会倒着数。开始日期晚于结束日期时,结果就是 #NUM!。如果两个日期的先后顺序不固定,就用 MIN 取较早的日期,用 MAX 取较晚的日期,再交给 DATEDIF。

开始日期晚于结束日期
C2
ABCD
1StartEndDATEDIFWith MIN and MAX
22026-03-102026-01-05#NUM!64
#NUM! 某个数字超出了这个函数的范围。

C2 显示 #NUM!,D2 返回 64。如果只要天数,=ABS(B2-A2) 不用 DATEDIF 也能得到同样的 64。遇到 "W" 这样无法识别的单位,DATEDIF 也会返回 #NUM!;如果某个日期是 Excel 无法识别为日期的文本,则返回 #VALUE!。

MD 单位可能算错

微软自己的文档都不建议使用 "MD":当开始日期的“日”在结束日期的上个月里不存在时,它可能返回负数。

从 1 月 31 日开始算 MD
C2
ABCD
1StartEndMDD
22026-01-312026-03-01-229
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

从 1 月 31 日到 3 月 1 日,"MD" 的结果是 -2:DATEDIF 从“2 月 31 日”开始算,而这个日期会顺延到 3 月 3 日,比结束日期晚了两天。天数 29 是对的。如果开始日期可能落在 29 日到 31 日,就用天数来表示时长,或者手动核对 MD 的结果。

练习:计算月数

轮到你了
C2
ABC
1StartEndMonths
22025-03-102026-01-05
点击单元格查看它的公式。修改数字或公式,表格会重新计算。

轮到你了: 在 C2 中计算 A2 中的开始日期到 B2 中的结束日期之间相差的整月数。

轮到你了:日期先后不定
C2
ABC
1Date 1Date 2Days
22026-04-182026-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 表格在函数帮助里列出了它。

Coddy 编程语言插图

和 Coddy 一起学编程

开始