DATEDIF関数の使い方・読み方|年齢や勤続年数を正確に計算する

執筆者:

カテゴリ:

DATEDIF関数の使い方・読み方のイメージ

日付

DATEDIF関数の使い方・読み方

Excel関数辞典

読み方:DATEDIF は「デートディフ」と読みます。(一般的な読み方です。公式に読み仮名の定めはありません)

DATEDIFは、2つの日付の差を、年・月・日の単位で求める関数です。

使える環境Excel○Googleスプレッドシート○
このページの中身(22項目)
  1. 書式
  2. 単位の意味
  3. 基本の使い方
  4. 「◯年◯ヶ月」を出す
  5. 実用例
  6. 既知の不具合に注意
  7. エラーの対処
  8. Excelとの違い
  9. 正式に案内されていない関数であるという前提
  10. 単位の指定で結果が変わる
  11. 開始日と終了日の順序
  12. 年齢と勤続年数の実務的な出し方
  13. 人事系の表で使う場面
  14. 基準日を変えて検証する
  15. 「日付」の関数を全体から見る
  16. 数式を書く前の手順
  17. どの関数でも共通する確認
  18. 引き継ぐときに残すこと
  19. このサイトの収録状況
  20. よくある質問
  21. まとめ
  22. 関連する関数

この記事の書式と対応環境の出どころ(2026-08-26 確認)

関数の仕様は追加・変更されることがあります。書式が合わないときは、上の公式ページで最新をご確認ください。

年齢、勤続年数、契約期間の計算に使います。単純な引き算では「◯年◯ヶ月」が出せないため、この関数が必要になります。

入力補完に出てこないという特徴があります。関数名を最後まで手入力してください。これは仕様で、Excelでも同じです。

DATEDIF関数の使い方の記事構成図
DATEDIF関数の使い方:この記事で扱う内容

書式

=DATEDIF(開始日, 終了日, "単位")
引数内容
開始日古いほうの日付
終了日新しいほうの日付
単位"Y" "M" "D" "YM" "MD" "YD"

開始日と終了日を逆にすると #NUM! になります。 引き算と違い、マイナスは返りません。

単位の意味

単位返すもの
"Y"満年数
"M"満月数
"D"日数
"YM"年を無視した月数(0〜11)
"MD"年月を無視した日数
"YD"年を無視した日数

単位は必ず " で囲みます。 大文字小文字は区別されません。

DATEDIF関数の使い方の要点図
DATEDIF関数の使い方

基本の使い方

生年月日がA1、今日との差で年齢を出します。

=DATEDIF(A1, TODAY(), "Y")

満年齢が正確に出ます

誕生日を迎えたかどうかまで判定されるのがポイントです。

単純な引き算では誤差が出ます。

=(TODAY() - A1) / 365        誤差が出る(うるう年を考慮しない)
=YEAR(TODAY()) - YEAR(A1)    誕生日前でも1歳増えてしまう

年齢や勤続年数は必ずDATEDIFを使ってください。

「◯年◯ヶ月」を出す

"Y" と "YM" を組み合わせます。

=DATEDIF(A1, TODAY(), "Y") & "年" & DATEDIF(A1, TODAY(), "YM") & "ヶ月"

結果:5年3ヶ月

"YM" は「年を無視した月数」なので、0〜11の値を返します。ここに "M"(総月数)を使うと 5年63ヶ月 のようになってしまいます。

日まで出すなら "MD" を足します。

=DATEDIF(A1, TODAY(), "Y") & "年" & DATEDIF(A1, TODAY(), "YM") & "ヶ月" & DATEDIF(A1, TODAY(), "MD") & "日"

実用例

勤続年数

=DATEDIF(入社日, TODAY(), "Y")

契約の残り日数

=DATEDIF(TODAY(), 契約終了日, "D")

終了日が過去だと #NUM! になります。IFERROR で包むか、IF で分岐してください。

=IF(契約終了日 < TODAY(), "期限切れ", DATEDIF(TODAY(), 契約終了日, "D"))

在籍月数

=DATEDIF(入社日, TODAY(), "M")

全行に適用する

=ARRAYFORMULA(IF(A2:A="", "", DATEDIF(A2:A, TODAY(), "Y")))

既知の不具合に注意

DATEDIFには古くから知られた不具合があります。

"MD" は、月末をまたぐ組み合わせで負の値や異常な値を返すことがあります。 これはExcel由来の問題で、Microsoftも「特定の状況で正しくない結果を返す」と認めています。

対策: "MD" の使用は避け、"Y" と "YM" までにとどめてください。日数まで厳密に必要なら、別の計算方法を検討したほうが安全です。

"YD" も同様の理由で、使用は推奨されません。

実務で安全に使えるのは "Y" "M" "D" "YM" の4つと考えてください。

エラーの対処

#NUM! が出る

開始日が終了日より後です。 引数の順番を確認してください。

過去の日付が入りうるなら、IF で分岐します。

=IF(A1 > B1, "順序が逆", DATEDIF(A1, B1, "Y"))

#VALUE! が出る

  • 日付が文字列になっている(セルが左寄せになっていないか確認)
  • 単位を " で囲んでいない

文字列の日付は DATEVALUE で変換してください。

=DATEDIF(DATEVALUE(A1), TODAY(), "Y")

関数名が入力補完に出てこない

これは仕様です

最後まで手入力してください。関数自体は正常に動きます。

Excelでも同じで、公式のヘルプにも「他の表計算ソフトとの互換性のために提供されている」という位置づけで記載されています。

結果が日付として表示される

セルの表示形式が「日付」になっています。「数値」に変更してください。

Excelとの違い

書式・挙動・不具合まで含めて共通です。入力補完に出ない点も同じです。

Excelには YEARFRAC(期間を年の小数で返す)もありますが、スプレッドシートにもあります。年齢のような「満年数」が必要な場面ではDATEDIFのほうが適切です。


正式に案内されていない関数であるという前提

期間を求めるこの関数には、他とは違う事情があります。入力の補助が表示されず、公式の一覧にも載っていないことがあります。それでも動作し、実務で広く使われています。

この背景には、他の表計算ソフトとの互換性を保つために残されている、という経緯があります。したがって、今後も動き続ける保証があるわけではありません。重要な業務で使う場合は、この点を理解しておいてください。

実務上の影響は二つあります。第一に、入力中に引数の説明が出ないため、書式を覚えておく必要があります。第二に、他の人がファイルを見たときに、何をしているのか分からない可能性があります。

とはいえ、年齢や勤続年数を正確に求める処理は頻繁に必要になります。代替の方法もありますが、この関数を使うのが最も短く書けます。使うなら、近くに用途を書き添えておくのが親切です。


単位の指定で結果が変わる

この関数は、三つ目の引数で単位を指定します。年、月、日のほか、端数の扱いが違う指定がいくつかあります。この指定を理解していないと、意図と違う結果になります。

年を指定すると、満年数が返ります。誕生日が来ていなければ、その年は数えません。年齢を求める用途では、これが正解です。

月を指定すると、満月数が返ります。年をまたいでも通算されるので、勤続月数を出すときに使えます。

日を指定すると、単純な日数の差が返ります。これは引き算でも求められるので、この関数を使う必要はありません。

端数を扱う指定もあります。年を除いた月数、年を除いた日数、月を除いた日数。これらを組み合わせると、「何年何か月何日」という表示が作れます。年齢や在籍期間を人が読む形で出したい場合に使います。

指定を間違えると、桁が違う数字が返るので、すぐ気づきます。しかし、年と月を取り違えた場合など、もっともらしい数字になることもあります。結果が想定と合っているか、既知の値で検算してください。


開始日と終了日の順序

引数の順序は、開始日が先、終了日が後です。逆にすると、エラーが返ります。

つまずきやすいのが、終了日に今日の日付を使う場合です。今日を求める関数を使うと、開くたびに再計算されます。年齢の表示としては正しい動作ですが、過去の時点の集計を固定したい場合には向きません。

たとえば、四月時点の在籍期間を一覧にしたい場合、今日を基準にすると五月になった時点で数字が変わります。基準日をセルに入力しておき、そこを参照する形にしてください。基準日を書き換えれば、その時点の値が得られます。

もうひとつ、開始日が終了日より後になるケースにも注意が必要です。退職日が入っていない行に、誤って古い日付が入っていると、エラーになります。エラーが出たら、まず日付の大小を確認してください。

未入力の行への対処も必要です。開始日が空欄だと、日付として扱われずに意図しない結果になります。先に空欄かどうかを判定して除外する書き方にしてください。


年齢と勤続年数の実務的な出し方

年齢を求める場合、誕生日を開始日、基準日を終了日として、年の単位を指定します。これで満年齢が返ります。

一覧表で使う場合、基準日はひとつのセルに置き、全行がそこを参照する形にしてください。行ごとに今日を求める関数を書くと、行数が多いときに再計算が重くなります。

勤続年数を「何年何か月」の形で出したい場合は、年の単位と、年を除いた月数の単位を別々に求めて連結します。連結の際に文字列へ変換する必要はなく、そのままつなげば数字として出ます。

退職者を含む一覧では、退職日が入っていればその日を、入っていなければ基準日を終了日にする、という分岐を入れます。この一手間で、在籍者と退職者を同じ表で扱えます。

なお、月末日の扱いには微妙な差があります。一月三十一日から二月二十八日までを何か月と数えるかは、定義によって変わります。契約や給与に関わる計算では、社内の定義を確認してから使ってください。関数の結果をそのまま採用してよいとは限りません。


人事系の表で使う場面

期間を求める処理は、人事や労務の管理でとくに頻繁に必要になります。実際の使い方を整理しておきます。

年齢は、生年月日と基準日から満年数を求めます。基準日は一箇所に置いて、全行がそこを参照する形にしてください。行ごとに今日の日付を求めると、行数が多いときに動作が重くなります。

勤続年数は、入社日と基準日から求めます。退職者を含む一覧では、退職日が入っていればその日を、入っていなければ基準日を終了日にする分岐を入れます。これで在籍者と退職者を同じ表で扱えます。

年次有給休暇の付与日数は、勤続年数に応じて決まります。勤続年数を求めてから、対応表で付与日数を引く形にすれば、基準が変わったときも表を直すだけで済みます。

年齢による区分も同様です。年代別の集計をする場合、年齢から区分を求める対応表を用意します。

これらの計算では、月末や年度末の扱いが業務のルールで決まっています。関数の結果をそのまま採用してよいとは限りません。就業規則や社内の定義を確認してから使ってください。


基準日を変えて検証する

期間の計算は、境界で間違えやすいものです。基準日を変えて検証する習慣をつけると、誤りに早く気づけます。

誕生日の前日、当日、翌日。この三つの日付で年齢を計算して、想定どおりになるかを確認してください。年齢の数え方には法律上の定義があり、直感と一致しないことがあります。

月末の入社日についても確認してください。一月三十一日入社の人の勤続一か月は、二月二十八日なのか三月一日なのか。定義によって変わります。

うるう年も確認対象です。二月二十九日生まれの人の年齢が、平年にどう計算されるか。

年度をまたぐ計算も確認してください。四月一日を年度の始まりとする場合、三月三十一日と四月一日で結果が変わるはずです。

こうした検証は、既知の値を使って行います。実際に自分の生年月日で計算してみれば、正しいかどうかがすぐ分かります。

検証用の行を表の下に残しておく方法もあります。想定される答えを書いておき、計算結果と一致するかを判定する数式を置きます。数式を修正したときに、この行を見れば壊れていないか確認できます。

「日付」の関数を全体から見る

日付と時刻を扱う関数群です。同じカテゴリの関数は、つまずく場所も似ています。この記事のほかに18本あります。

記事
DATE
DATEVALUE
DAY
DAYS
EDATE
EOMONTH
HOUR
MINUTE
MONTH
NETWORKDAYS
NOW
TIME
TODAY
WEEKDAY
WEEKNUM
WORKDAY
YEAR
YEARFRAC

このカテゴリで共通するつまずき

文字列の日付には使えません。日付として認識されているかを先に確認してください。1つで理解した内容は、同じカテゴリの他の関数にもそのまま使えます。

どれを使うかの決め方

日数・月数・営業日のどれが必要かで使う関数が決まります。関数の一覧を眺めて選ぼうとすると、どれも当てはまるように見えて決まりません。

迷ったときは

→ 全関数の一覧 に目的別の索引があります。


数式を書く前の手順

先に決めておけば、書くのは数分で終わります。

1. 出したい結果を一文で書く

「何を、どの条件で、どんな形で出したいか」。この一文が書ければ、関数はほぼ決まります。書けないなら、まだ要件が固まっていません。

2. 元データの型を確認する

文字列の日付には使えません。日付として認識されているかを先に確認してください。=ISNUMBER(A2) で数値かどうかを確認できます。見た目が同じでも、数値と文字列は別物です。

3. 空欄と0の扱いを決める

未入力なのか、実績が0なのか。表の意味が変わります。どちらとして扱うかを決めてから書いてください。

4. 条件の数を数える

日数・月数・営業日のどれが必要かで使う関数が決まります。将来条件が増える可能性があるなら、最初から複数条件に対応する形にしてください。

5. 共有先の環境を確認する

新しい関数は、古い環境で開くとエラーになります。社外に渡すファイルでは、この一点で選択肢が変わります。

6. 1行だけ書いて確認する

全行にコピーする前に、1行分の結果が正しいかを見てください。間違ったまま広げると、直す手間が増えます。


どの関数でも共通する確認

うまくいかないときに見る場所は、ほぼ決まっています。

参照を固定したか

下方向にコピーする数式では、動いてはいけない参照を固定します。上の数行だけ見て判断しないでください。ずれは下のほうで表面化します。

範囲の行数が揃っているか

複数の範囲を渡す関数では、行数がずれると結果が狂います。エラーにならず値が返るため、気づきにくい種類の間違いです。

型が揃っているか

=ISNUMBER(A2)

数値として入っているかを判定します。システムから書き出したデータでは、これが原因のことが多くあります。

前後に空白が入っていないか

=LEN(A2)&" / "&LEN(TRIM(A2))

数が違えば、余分な空白が入っています。見た目では判別できません。

別の方法で検算したか

同じ数字を別の関数でも出して、突き合わせてください。1つの結果だけを見ても、正しいかどうかは判断できません。

最終行まで確認したか

一番下までスクロールして、結果を見てください。途中から値が変わっていないかを確認します。


引き継ぐときに残すこと

数式は動いていても、意図は残りません。渡す前に、次の点をシート内にメモしてください。3分で終わります。

何を出している数式か

一行で構いません。読めば分かると思っても、数か月後の自分には分かりません。

どの表を参照しているか

参照先のシート名と、更新の担当。別ファイルなら、その場所も書いてください。

該当しないときの扱い

空欄にしているのか、文言を出しているのか、エラーのまま残しているのか。書いていないと、受け取った側は空欄をデータなしと読みます。

触ってはいけない場所

列を挿入すると壊れる数式がある場合、必ず書き残してください。この一行があるだけで、引き継ぎ後の事故が大きく減ります。

使った関数の対応環境

新しい関数を使っている場合、古い環境では開けません。共有の範囲が広がる可能性があるなら、明記してください。

確定した期間は値にする

締めた月の集計は、値貼り付けにしてください。参照元を消しても壊れなくなり、ファイルも軽くなります。

このサイトの収録状況

収録は201本です。カテゴリごとの内訳を出しておきます。

カテゴリ記事数
目的別51本
集計47本
文字列31本
日付19本 ←この記事
検索・参照15本
条件15本
機能12本
配列・抽出10本
関数一覧1本

探し方の順番

関数名が分かっているなら検索窓から。やりたいことだけ決まっているなら「目的別」から。近い関数を比べたいなら、同じカテゴリの一覧から入ってください。

記事の構成

どの記事も、書式・実例・つまずきやすいところ・似た関数との使い分けを同じ順番で並べています。1本読めば、他の記事も同じ場所を探せます。


よくある質問

Q. 入力候補に出てきません

正式に案内されていない関数のため、補助が表示されないことがあります。書式を直接入力すれば動作します。

Q. 数値が返ります

セルの表示形式が日付になっています。標準か数値に変えてください。

Q. エラーになります

開始日が終了日より後になっているか、日付として認識されていない値が入っています。

Q. 単位の指定はどう書きますか

年、月、日を表す英字を、ダブルクォートで囲んで指定します。端数を扱う指定は二文字になります。

Q. 今日時点の値にしたいのですが

今日を求める関数を終了日に指定します。ただし、開くたびに再計算される点に注意してください。

Q. 空欄の行がエラーになります

先に空欄かどうかを判定して、空欄なら空文字を返す形にしてください。

Q. 他の方法で年齢を出せますか

年月日を取り出して比較する書き方もありますが、うるう年や月末の扱いで例外が出やすくなります。

Q. 月末の扱いが直感と違います

満月数の数え方は定義によって差が出ます。業務上の定義を確認してから使ってください。



まとめ

  • 書式は =DATEDIF(開始日, 終了日, "単位")
  • 年齢・勤続年数は必ずDATEDIF。引き算では誤差が出る
  • 「◯年◯ヶ月」は "Y" と "YM" の組み合わせ
  • "MD" "YD" は既知の不具合があるので使わない
  • 開始日と終了日が逆だと #NUM!
  • 入力補完に出てこないのは仕様

関連する関数