DATEDIF 实练:5 道关于「Excel 不肯自动补全的那个函数」的题

五道 DATEDIF 的题——包括微软自己的文档都发出警告的那个单位。每组先讲成因,再给你一个情形去判断。

DATEDIF 很特别:它在每个当前版本的 Excel 里都能用,但编辑器不给它自动补全、不显示它的参数,而微软的文档还对它的某个单位挂着一条警告。用的人极多、支持却极少——这个组合正是它值得动手练、而不是查一下就走的原因。

三件事解释了几乎全部的 DATEDIF 问题。单位代码分成三个直白的和三个「余数」,把 "m" 和 "ym" 搞混,结果会差出好几年。把较晚的日期写在前面,返回的是 #NUM! 而不是负数。而 "md" 这个单位有一个有据可查的缺陷,可能给出负数结果——因为它在比较「日」之前就把月份丢掉了,于是没有任何东西可供借位。

下面的内容在 Microsoft 365、Excel 2021 及较新版本中行为一致。每题先自己判断,再看答案。

三个成因,五道题

六个单位代码,以及其中哪两个是安全的

2 道题

DATEDIF 的参数是(起始日, 结束日, 单位),单位是一个带引号的文本代码。三个是直白的:"y" 给完整年数,"m" 给完整月数,"d" 给整天数。另外三个是「余数」,存在的意义是让你拼出「3 年 2 个月」这类说法:"ym" 是扣掉整年之后剩的月数,"yd" 是扣掉整年之后剩的天数,"md" 是扣掉整年整月之后剩的天数。麻烦都出在余数这三个上——微软自己的文档就带着一条警告说 "md" 可能返回负数——所以把 "y"、"m"、"ym" 当作可靠的那一组,其余的只在你核对过具体日期之后再用。

通常怎么表现「DATEDIF 的 y m d 怎么用」·「两个日期之间相差几年几个月怎么算?」

第 1 题

你要根据 A2 里的出生日期算出到今天为止的周岁。哪个公式是对的?

=DATEDIF(A2, TODAY(), "y")

=DATEDIF(TODAY(), A2, "y")
  1. A第二个——较大的日期写在前面
  2. B第一个——较早的日期必须是第一个参数,否则 DATEDIF 返回 #NUM!
  3. C两个都行;DATEDIF 会自动帮你排序
  4. D都不对;算年龄要用 YEARFRAC
看答案与解析

正确答案B. 第一个——较早的日期必须是第一个参数,否则 DATEDIF 返回 #NUM!

🐱 DATEDIF 不会帮你排序参数。起始日晚于结束日时它返回 #NUM! 而不是负数——好在这让错误至少是可见的。这是 DATEDIF 最常见的错误,通常出现在有人调整了列顺序、又凭眼睛改了公式之后。另外注意 "y" 数的是完整年数,这正好符合大家说年龄的方式:差一天到生日的人仍算小的那个数,而这正是你要的。

第 2 题

你想把一段时长显示成「3 年 2 个月」。哪一对单位代码能给出这两个数?

=DATEDIF(A2, B2, "y") & " 年 " & DATEDIF(A2, B2, ???) & " 个月"
  1. A"m"——它给的就是月份部分
  2. B"ym"——扣掉完整年数之后剩下的月数
  3. C"md"——月份的余数代码
  4. D"yd"——年和天合起来
看答案与解析

正确答案B. "ym"——扣掉完整年数之后剩下的月数

🐱 "m" 返回的是整段跨度的总月数,所以三年的间隔会打印成「3 年 38 个月」。你要的余数是 "ym",它会先把完整年数扣掉。余数代码存在的意义正在于此。顺带值得注意它的命名逻辑:代码读作「扣掉前一个字母之后还剩什么」——"ym" 是扣年剩月,"yd" 是扣年剩天,"md" 是扣月剩天。这个命名一旦想通,六个代码就不用背了。

"md" 单位可能返回负数

1 道题

"md" 是唯一一个有据可查的缺陷单位:微软自己的参考文档就警告说它可能给出负数、零或不准确的结果。原因是它在比较「日」之前把年和月都丢掉了,于是当结束日的号数小于起始日的号数时,减法直接跌破零,而没有月份可供借位。这不是靠小心就能绕开的边界情况——它是这个单位的固有性质。如果你需要一个表现正常的天数余数,改用「减去一个构造出来的日期」来算,那样借位关系还在。

通常怎么表现「DATEDIF 返回了负数」·「DATEDIF 的 md 算错了」

第 3 题

起始日是 2026 年 1 月 31 日,结束日是 2026 年 3 月 1 日。=DATEDIF(A2, B2, "md") 返回什么?

  1. A1——二月底过后的一天
  2. B一个负数,因为「日」从 31 号掉到 1 号,而已经没有月份可以借位了
  3. C29——二月的天数
  4. D#NUM!
看答案与解析

正确答案B. 一个负数,因为「日」从 31 号掉到 1 号,而已经没有月份可以借位了

🐱 "md" 先把年和月剥掉,然后拿 1 号减 31 号,而由于月份已经被丢弃,没有任何东西可供借位——结果就成了负数。微软把这个行为记为一个已知限制而不是待修的缺陷,所以实用的建议是:在任何无人值守运行的地方都别用 "md"。一个可靠的天数余数替代写法是 =B2 - EDATE(A2, DATEDIF(A2,B2,"m"))——先把起始日按整月推进,再拿真实日期相减,借位关系因此得以保留。

为什么 Excel 不给 DATEDIF 自动补全

1 道题

DATEDIF 在每一个现代版本的 Excel 里都存在,但有意不对外露出:它不出现在公式自动补全的下拉里,输入时也不给参数提示。它是从 Lotus 1-2-3 的兼容性中留存下来的,微软的文档主要也是出于这个原因保留它。实际后果有三个:函数名和全部参数都得自己完整打出来;单位代码打错时失败成 #NUM! 而不是一条有帮助的提示;以及审你这份文件的同事完全有理由以为这个函数是你编的。

通常怎么表现「DATEDIF 打不出来」·「DATEDIF 还受支持吗?」

第 4 题

同事说 DATEDIF 肯定被废弃了,因为他打 =DAT 的时候它从来不出现。事实是什么?

  1. A它在 Microsoft 365 里被移除了,只在旧文件里还能用
  2. B它正常工作,只是被从自动补全和参数提示里隐藏了,这是为兼容旧版而有意为之
  3. C只有装了某个加载项它才存在
  4. D它需要启用「分析工具库」
看答案与解析

正确答案B. 它正常工作,只是被从自动补全和参数提示里隐藏了,这是为兼容旧版而有意为之

🐱 这个函数在当前版本里计算完全正常,只是编辑器不宣传它。不需要安装或启用任何东西。知道这件事的价值是实用的而非琐碎的:正因为没有参数提示,单位代码写错时只会得到一个 #NUM!、且不提示是哪个参数错了——所以 DATEDIF 一旦失败,第一件要查的就是单位的拼写和引号:是 "y" 而不是 y,也不是多了个空格的 "y "

继续练

DATEDIF — 常见问题

为什么我打 DATEDIF 的时候它不出现?

它被从自动补全里隐藏了,也不给参数提示,这是为兼容 Lotus 1-2-3 而有意为之的选择。函数本身在当前版本里正常工作——你只是得把函数名和全部参数自己打全,而单位代码打错时会失败成 #NUM!,并且不提示是哪个参数错了。

DATEDIF 为什么返回 #NUM!?

最常见的是起始日晚于结束日——DATEDIF 不会帮你排序参数,它选择直接拒绝而不是返回负数。另一个原因是单位代码写坏了:它必须是带引号的文本比如 "y",不能是裸的 y,引号内多一个空格同样会失败。

"m" 和 "ym" 有什么区别?

"m" 返回整段跨度的完整月数;"ym" 返回扣掉完整年数之后剩下的月数。要拼「3 年 2 个月」这样的说法,用的是 "y" 和 "ym"——用 "m" 会打印出总数,比如 38 个月。

"md" 这个单位能用吗?

不建议。微软自己的参考文档警告说 "md" 可能返回负数、零或不准确的结果,因为它在比较「日」之前把年和月都丢掉了,于是没有东西可供借位。要一个表现正常的天数余数,改用 =B2 - EDATE(A2, DATEDIF(A2,B2,"m"))

用 DATEDIF 怎么算周岁?

出生日期放在 A2,写 =DATEDIF(A2, TODAY(), "y")。"y" 数的是完整年数,正好符合年龄的通常说法——差一天到生日的人仍显示较小的那个数。