Excelで「この人は今何歳?」「入社から何年経った?」と計算したい場面、ありますよね。生年月日と今日の日付から年齢を出したいのに、ぴったりの関数が見つからない。
そんなときに使えるのが DATEDIF関数 です。この記事では、基本の書き方から6つの単位の違い、年齢・勤続年数の実務パターン、”MD”単位の既知バグと回避策まで解説します。
この記事は次のような人におすすめ
– 生年月日から年齢を自動計算したい
– 入社日から勤続年数を「○年○ヶ月」で表示したい
– DATEDIF関数の6つの単位の違いを知りたい
– “MD”のバグが不安で正しい回避策を知りたい
DATEDIF関数とは?
DATEDIF関数は、2つの日付の間の期間を 年数・月数・日数 で求めるExcelの関数です。
ほかの日付関数との大きな違いは、「○年」「○ヶ月」と単位を選べる点です。年齢計算や勤続年数の算出にぴったりですよ。
DATEDIF関数の読み方と意味
読み方は「デイトディフ」です。Date(日付)+ Difference(差) が語源で、そのまま「日付の差」を意味します。
非公開関数とは何か
DATEDIF関数は、Excelの 非公開関数 です。関数ダイアログや入力補完の候補に表示されません。
もともとLotus 1-2-3という表計算ソフトとの互換性のために残された関数です。Excel 2000のヘルプでは公式に記載されていましたが、現在は通常の関数一覧から外されています。
ただし、動作自体にはまったく問題ありません。すべてのバージョンのExcelで使えます。数式を手入力すれば普通に動きますよ。
廃止される心配はない?
極めて低いと考えてよいでしょう。すべてのExcelバージョンで動作し、Microsoftのサポートページも存続しています。ただし公式サポート対象外なので、将来の仕様変更がゼロとは言い切れません。重要な業務で使う場合は、この点を頭に入れておいてください。
DATEDIF関数の書き方
基本構文と3つの引数
=DATEDIF(開始日, 終了日, 単位)
| 引数 | 必須/省略可 | 説明 |
|---|---|---|
| 開始日 | 必須 | 期間の始まりの日付(古いほうの日付) |
| 終了日 | 必須 | 期間の終わりの日付(新しいほうの日付) |
| 単位 | 必須 | 結果の形式を指定する文字列 |
引数の順番に注意してください。開始日が先、終了日が後 です。DAYS関数は「終了日, 開始日」と逆順なので、混同しないようにしましょう。
開始日が終了日より後の日付だと #NUM! エラー になります。DAYS関数のようにマイナスの値は返りません。
日付はセル参照のほか、DATE関数で直接指定することもできます。
=DATEDIF(DATE(2020,4,1), DATE(2026,3,21), "Y")
文字列で "2020/4/1" と書いても動きます。ただしDATE関数のほうが確実に日付として認識されるので安心です。
6つの単位の違い一覧
DATEDIF関数の特徴は、第3引数の「単位」で結果を細かく指定できる点です。
| 単位 | 意味 | 2020/4/1 → 2026/3/21 の結果 |
|---|---|---|
| “Y” | 期間の満年数 | 5 |
| “M” | 期間の総月数 | 71 |
| “D” | 期間の総日数 | 2182 |
| “YM” | 年を無視した端数の月数 | 11 |
| “MD” | 月と年を無視した端数の日数 | 20 |
| “YD” | 年を無視した通算日数 | 355 |
“Y” “M” “D” はそのまま年数・月数・日数を返します。
“YM” “MD” “YD” は 端数を取り出す ための単位です。たとえば「5年11ヶ月20日」のうち、”YM” は「11」の部分だけを返します。
“MD” には既知のバグがあります
“MD” は一部の日付で不正確な値を返します。詳しくはこの記事の後半で解説しています。
DATEDIF関数の基本的な使い方
年数を求める(単位 Y)
A1に「2020/4/1」、B1に「2026/3/21」と入っている場合です。
=DATEDIF(A1, B1, "Y")
結果: 5
開始日から終了日までの満年数が返ります。6年に満たないので「5」です。
月数を求める(単位 M)
同じセルを使って月数を求めてみましょう。
=DATEDIF(A1, B1, "M")
結果: 71
2020年4月から2026年3月までの総月数です。
日数を求める(単位 D)
=DATEDIF(A1, B1, "D")
結果: 2182
総日数が返ります。日数だけならDAYS関数や引き算でも同じ結果になります。
端数の月・日を取り出す(YM/MD)
「5年 11ヶ月 20日」の端数月を取り出すには “YM” を使います。
=DATEDIF(A1, B1, "YM")
結果: 11
年を無視した端数の月数だけが返ります。
同様に、端数の日数は “MD” で取り出せます。
=DATEDIF(A1, B1, "MD")
結果: 20
ただし “MD” には既知のバグがあります。正確な端数日数が必要な場合は、後述の回避策を使ってください。
DATEDIF関数の実務活用パターン
年齢を自動計算する(TODAY関数との組み合わせ)
人事・総務でよく使うのが年齢計算です。A2に生年月日が入っている場合、TODAY関数と組み合わせます。
=DATEDIF(A2, TODAY(), "Y")
TODAY関数はファイルを開くたびに当日の日付を返します。この数式を入れておけば年齢が毎日自動で更新されますよ。
たとえばA2が「1990/5/15」なら、2026年3月21日時点で 35 と表示されます。
勤続年数を「○年○ヶ月」で表示する
入社日(A2)から今日までの勤続年数を「3年5ヶ月」のように表示する方法です。”Y” と “YM” を組み合わせます。
=DATEDIF(A2, TODAY(), "Y") & "年" & DATEDIF(A2, TODAY(), "YM") & "ヶ月"
“Y” で年数、”YM” で端数の月数を取り出し、& で文字列連結しています。
A2が「2022/10/1」なら「3年5ヶ月」のように表示されます。
さらに日数まで含めた「○年○ヶ月○日」の表示も可能です。ただし “MD” にはバグがあるため、次の代替式を使ってください。
=DATEDIF(A2,TODAY(),"Y")&"年"&DATEDIF(A2,TODAY(),"YM")&"ヶ月"&(TODAY()-EDATE(A2,DATEDIF(A2,TODAY(),"M")))&"日"
日数部分でEDATE関数を使い、”MD” のバグを回避しています。
契約の残り期間を表示する
契約終了日(B2)までの残り期間を表示する例です。開始日にTODAY関数を指定します。
=DATEDIF(TODAY(), B2, "Y") & "年" & DATEDIF(TODAY(), B2, "YM") & "ヶ月"
TODAY関数(今日)が開始日、B2(契約終了日)が終了日です。順番を逆にすると#NUM!エラーになるので注意してください。
“MD”単位の既知バグと回避策
どんな場合に不正確な値になるか
“MD” は月末日をまたぐ特定の日付で、負の値や不正確な値を返します。Microsoftも公式に「MDの使用は推奨しない」と警告しています。
具体的な問題例を見てみましょう。
| 開始日 | 終了日 | “MD” の結果 | 正しい値 |
|---|---|---|---|
| 2016/1/31 | 2016/3/1 | -2 | 1 |
| 2016/1/30 | 2016/3/1 | -1 | 1 |
| 2016/3/31 | 2016/5/1 | 0 | 1 |
1月31日から3月1日は1日の差のはずなのに、結果は「-2」です。このように月末付近の日付で計算が狂います。
なお、”Y” “M” “YM” は基本的に安全です。ただし、うるう年が絡む特殊なケース(例: 2020/2/29 → 2021/2/28)では、”MD” 以外の単位でも予期しない値を返すことがあります。通常の日付ペアでは心配いりませんが、2月29日を含む計算は結果を確認しておくと安心です。
代替式で正確に端数日数を求める方法
“MD” の代わりに、次の式を使えば正確な端数日数が求められます。
=B1 - EDATE(A1, DATEDIF(A1, B1, "M"))
仕組みはこうです。
DATEDIF(A1, B1, "M")で完了した月数を求める- EDATE関数で開始日をその月数分だけ進める
- 終了日との差が正確な端数日数になる
先ほどの問題例(2016/1/31 → 2016/3/1)で試すと、結果は正しく 1 になります。
“MD” を使っている数式があれば、この代替式に置き換えることをおすすめします。
DATEDIF / DAYS / YEARFRAC 三者比較
3関数の特徴と適切な使い分け
日付の差を求める関数は3つあります。それぞれ得意分野が違います。
| 比較項目 | DATEDIF | DAYS | YEARFRAC |
|---|---|---|---|
| 返す値 | 年/月/日(6単位) | 日数のみ | 小数の年数 |
| 引数の順番 | 開始日, 終了日 | 終了日, 開始日 | 開始日, 終了日, 基準 |
| 公式関数か | いいえ(非公開) | はい(2013以降) | はい |
| 年齢計算 | 最適(整数で正確) | 不向き | うるう年で誤差あり |
| 主な用途 | 年齢・勤続年数 | 日数差・残日数 | 利子・利回り計算 |
| 既知のバグ | MD単位 | なし | なし |
DAYS関数は日数を返す公式関数です。YEARFRAC関数は小数の年数を返し、財務計算で使われます。
判断フロー|何を計算したいかで関数を選ぶ
- 年齢や勤続年数を「○年○ヶ月」で出したい → DATEDIF関数
- 日数の差だけをシンプルに求めたい → DAYS関数または引き算
- マイナスの値がほしい(期限超過の判定) → DAYS関数
- 利率や利回りの年数計算 → YEARFRAC関数
- Excel 2010以前で日数を計算したい → DATEDIF関数または引き算
日数だけならDAYS関数が公式関数で安心です。年数や月数が必要になったらDATEDIF関数の出番、と覚えておきましょう。
よくあるエラーと対処法
エラーが出たときは、次の表を参考にしてみてください。
| エラー・症状 | 原因 | 対処法 |
|---|---|---|
| #NUM! | 開始日が終了日より後 | 日付の順番を確認する。古いほうが第1引数 |
| #NUM! | 単位の文字列が無効 | “Y” “M” “D” “YM” “MD” “YD” のいずれかを指定する |
| #VALUE! | 日付として認識できない値 | セルが正しい日付データか確認する。文字列ならDATE関数を使う |
| #NAME? | 関数名のスペルミス | “DATEDIFF”(Fが2つ)は間違い。正しくは “DATEDIF” |
| 入力補完に出ない | 非公開関数のため | 正常です。「=DATEDIF(」と手入力してください |
| 結果が0になる | 期間が単位に満たない | “Y” は満1年に達しないと0を返します。”M” や “D” で確認してみてください |
まとめ
DATEDIF関数は、2つの日付の期間を年数・月数・日数で求められる関数です。
- =DATEDIF(開始日, 終了日, 単位) で期間を計算する
- 6つの単位で 年数(“Y”)・月数(“M”)・日数(“D”) を使い分けられる
- “YM” で端数の月数、“MD” で端数の日数を取り出せる
- TODAY関数と組み合わせれば 年齢や勤続年数が毎日自動更新 される
- “MD” には既知のバグ がある。代替式
=終了日-EDATE(開始日,DATEDIF(開始日,終了日,"M"))を使おう - 非公開関数だが 全バージョンで動作 し、廃止リスクは極めて低い
- 日数だけならDAYS関数、年数・月数ならDATEDIF関数
年齢計算や勤続年数の管理に、ぜひDATEDIF関数を活用してみてください。日付計算の関数を網羅的に知りたい方は、Excelの日付計算を完全攻略もあわせてチェックしてみてください。
関連記事
関数一覧
どちらの関数一覧からでも各関数の解説記事へアクセスできます。
