DATEDIF関数の使い方|2つの日付の差を計算する
DATEDIF関数は、2つの日付の間の期間を年・月・日の単位で計算する関数です。年齢の計算、勤続年数の算出、契約期間の計算など、日付の差を求める場面で活躍します。Excelの関数一覧には表示されない隠し関数ですが、数式として入力すれば問題なく使えます。
DATEDIF関数の基本構文
=DATEDIF(開始日, 終了日, 単位)
引数の説明
| 引数 | 説明 | 必須/任意 |
|---|---|---|
| 開始日 | 期間の開始日 | 必須 |
| 終了日 | 期間の終了日(開始日以降の日付) | 必須 |
| 単位 | 返す値の単位を文字列で指定 | 必須 |
単位の種類
| 単位 | 説明 | 例(2024/1/15 から 2026/6/18) |
|---|---|---|
| “Y” | 完了した年数 | 2 |
| ”M” | 完了した月数 | 29 |
| ”D” | 日数 | 885 |
| ”YM” | 年を無視した月数 | 5 |
| ”YD” | 年を無視した日数 | 154 |
| ”MD” | 年と月を無視した日数 | 3 |
DATEDIF関数が一覧に表示されない理由
DATEDIF関数はLotus 1-2-3との互換性のために残されている関数で、Excelの公式な関数一覧やオートコンプリートには表示されません。しかし、現在のExcelでも正常に動作し、広く使われています。関数の挿入ダイアログでは見つけられないため、直接セルに数式を入力してください。
実践例1:年齢の計算
生年月日から現在の満年齢を計算します。
=DATEDIF(A2, TODAY(), "Y")
A2に「1990/05/20」が入力されている場合、TODAY()の日付に基づいて満年齢が返されます。単位「Y」は完了した年数を返すため、誕生日が来る前は1歳少なく表示されます。
実践例2:勤続年数を「○年○ヶ月」で表示
入社日から現在までの勤続年数を詳細に表示します。
=DATEDIF(A2, TODAY(), "Y") & "年" & DATEDIF(A2, TODAY(), "YM") & "ヶ月"
「Y」で完了した年数、「YM」で年を無視した残りの月数を求めることで、「5年3ヶ月」のような表示が実現できます。
日数まで含める場合は次のようにします。
=DATEDIF(A2, TODAY(), "Y") & "年" & DATEDIF(A2, TODAY(), "YM") & "ヶ月" & DATEDIF(A2, TODAY(), "MD") & "日"
実践例3:契約期間の計算
契約開始日と終了日から契約期間の月数を求めます。
=DATEDIF(A2, B2, "M")
A2に開始日、B2に終了日が入っている場合、完了した月数が返されます。
残りの日数を含めた詳細な期間は次のように計算します。
=DATEDIF(A2, B2, "M") & "ヶ月" & DATEDIF(A2, B2, "MD") & "日"
実践例4:次の誕生日までの日数
次の誕生日まであと何日かを計算する例です。
=DATEDIF(TODAY(), DATE(YEAR(TODAY()) + IF(DATE(YEAR(TODAY()), MONTH(A2), DAY(A2)) <= TODAY(), 1, 0), MONTH(A2), DAY(A2)), "D")
この数式は、今年の誕生日がすでに過ぎている場合は来年の誕生日までの日数を、まだ来ていない場合は今年の誕生日までの日数を返します。
実践例5:在職期間に応じた有給日数の判定
勤続年数に応じて有給休暇の日数を判定する例です。DATEDIF関数とIFS関数を組み合わせます。
=IFS(DATEDIF(A2, TODAY(), "Y") >= 6, 20, DATEDIF(A2, TODAY(), "Y") >= 5, 18, DATEDIF(A2, TODAY(), "Y") >= 3, 14, DATEDIF(A2, TODAY(), "Y") >= 2, 12, DATEDIF(A2, TODAY(), "Y") >= 1, 11, DATEDIF(A2, TODAY(), "M") >= 6, 10, TRUE, 0)
勤続年数に応じた有給日数を自動判定しています。
よくあるエラーと対処法
#NUM!エラー
開始日が終了日より後の場合に発生します。DATEDIF関数は開始日が終了日以前でなければなりません。
# エラーになる(開始日が終了日より後)
=DATEDIF("2026/06/18", "2026/01/01", "D")
# 正しい
=DATEDIF("2026/01/01", "2026/06/18", "D")
日付の前後関係が不確実な場合は、IF関数で事前にチェックします。
=IF(A2>B2, "日付の前後が逆です", DATEDIF(A2, B2, "Y") & "年")
#VALUE!エラー
日付として認識できない値が入力されている場合に発生します。セルの値が正しい日付形式であることを確認してください。
「MD」単位の注意点
「MD」(年と月を無視した日数)は、一部のケースで不正確な結果を返すことが報告されています。特に月末付近の日付で問題が起こることがあります。
代替方法として、DAY関数を使って日数部分を計算できます。
# DATEDIFの「MD」の代替
=DAY(B2) - DAY(A2) + IF(DAY(B2) < DAY(A2), DAY(DATE(YEAR(B2), MONTH(B2), 0)), 0)
オートコンプリートに表示されない
前述の通り、DATEDIFはExcelの関数一覧に含まれていません。数式バーに直接入力する必要があります。入力後は正常に動作します。
DATEDIF関数を使わない代替方法
DATEDIF関数に頼らずに日付の差を計算する方法もあります。
日数の計算
日付の引き算で直接求められます。
=B2 - A2
月数の計算(近似値)
YEARFRAC関数やEDATE関数を使った方法があります。
=(YEAR(B2) - YEAR(A2)) * 12 + MONTH(B2) - MONTH(A2)
ただし、この方法は日の部分を考慮しないため、DATEDIF関数の「M」とは微妙に異なる結果になることがあります。
年数の計算
=YEARFRAC(A2, B2)
YEARFRAC関数は小数点以下も含む年数を返します。
Google スプレッドシートでの互換性
DATEDIF関数はGoogle スプレッドシートでも利用可能です。構文と動作はExcelと同じです。Google スプレッドシートでもオートコンプリートには表示されませんが、直接入力すれば使えます。
まとめ
DATEDIF関数は2つの日付の期間を計算する関数です。
- 年(Y)、月(M)、日(D)の単位で期間を返す
- YM、YD、MDで部分的な期間を求められる
- 関数一覧には表示されないが正常に動作する
- 開始日は終了日以前でなければならない
- 「MD」単位は一部のケースで不正確な場合がある
年齢計算、勤続年数、契約期間など、日付の差を求める場面で幅広く活用できます。DATEDIF関数の特性を理解して、正確な期間計算に役立てましょう。