タグ: DATEDIF

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

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

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

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

    書式

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

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

    単位の意味

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

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

    基本の使い方

    生年月日が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のほうが適切です。

    まとめ

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

    関連する関数