生年月日から年齢を計算するには

[Access 2016/2013/2010/2007]

顧客の年齢別の購買状況を分析したいときなど、Accessで年齢を求めたいことがあります。ここでは、生年月日をもとに年齢を計算する方法とその考え方を解説します(図1)。

図1 [生年月日]フィールドをもとに年齢を計算する。

スポンサーリンク

手順ダイジェスト

年齢: IIf(Format(Date(),"mmdd")<Format([生年月日],"mmdd"),DateDiff("yyyy",[生年月日],Date())-1,DateDiff("yyyy",[生年月日],Date()))

手順解説

DateDiff関数 1つでは正確な年齢を求められない!

AccessのDateDiff関数をご存知でしょうか。2つの日時の間隔を求める関数です。年単位の間隔を調べたいときは、引数[単位]に「"yyyy"」を指定します(構文1、正式な構文はDateDiff関数のページを参照してください)。

構文1 2つの日時の間隔を求める
DateDiff(単位, 日時1, 日時2)

実は、このDateDiff関数には、知らないと陥りやすい大きな大きな落とし穴があります。引数[単位]に「"yyyy"」を指定して[日時1]と[日時2]の「年」を求めた場合、求められるのは[日時1]と[日時2]の間の実際の年数ではなく、[日時1]と[日時2]の間の年をまたいだ回数なのです(図2)。

図2 DateDiff関数で「年」を求める場合、「2017/12/31」から「2018/1/1」までは1回年をまたぐので「1年」、「2018/1/1」から「2018/12/31」までは1回も年をまたがないので「0年」となる。

このことを知らないと、[生年月日]フィールドから年齢を求めるのに、次のような式を立ててしまいがちです。式中の「Date()」は本日の日付を返す関数です。

× DateDiff("yyyy",[生年月日],Date())

しかし、この式で年齢を計算した場合、どの誕生日の人でも1月1日の時点で年齢が 1 加算されてしまいます。つまり、DateDiff関数 1つでは正確な年齢を求めることはできません。

年齢を計算するための式とその考え方

DateDiff関数で求められる年数は、1月1日の時点で 1 加算されます。そこで、DateDiff関数を使って年齢を求めるには、本日の「月日」と生年月日の「月日」を比べ、本日の「月日」が生年月日より前ならDateDiff関数の戻り値から「1」を引きます(図3)。

図3 本日が誕生日前なら、DateDiff関数で求めた年数から「1」を引く。

本日の日付を求めるためにDate関数(構文2)、生年月日と本日の日付から「月日」を抜き出すためにFormat関数構文3)、2つの「月日」を比べて条件分岐するためにIIf関数を使用します(構文4)。年齢を求める式は、式1のようになります。

構文2 現在の日付を返す
Date()

構文3 データに書式を設定して返す
Format(データ, 書式)

構文4 式の真偽に応じて値を切り替える
IIf(, 真の場合, 偽の場合)

式1 [生年月日]フィールドと本日の日付をもとに年齢を計算する
IIf(Format(Date(),"mmdd")<Format([生年月日],"mmdd"),DateDiff("yyyy",[生年月日],Date())-1,DateDiff("yyyy",[生年月日],Date()))

クエリで年齢を計算するには

実際に、クエリで[年齢]フィールドを作成してみましょう。長い式をデザイングリッドに直接入力するのは大変なので、ここでは[ズーム]ウィンドウを使用して入力することにします。図4図6のように操作してクエリを作成します。

図4 新しい[フィールド]欄にカーソルを置いて、[Shift]+[F2]キーを押す。

図5 [ズーム]ウィンドウが開いたら、「年齢: IIf(Format(Date(),"mmdd")<Format([生年月日],"mmdd"),DateDiff("yyyy",[生年月日],Date())-1,DateDiff("yyyy",[生年月日],Date()))」と入力して[OK]ボタンをクリックする。

図6 図5で入力した式が[フィールド]欄に表示された。

図7は「2017/8/1」時点でのクエリの実行結果ですが、同じ「1986年」生まれでも、4月生まれと12月生まれでは年齢が1歳違っていることがわかります。

図7 「2017/8/1」時点でのクエリの実行結果。

年齢を求める式は複雑ですが、式の意味を深追いせずに、公式として使用してもいいと思います。

メモ

一般的な年齢と法律上の年齢
一般的な考え方では誕生日当日に 1 歳年を取りますが、法律上では誕生日の前日に 1 歳年を取ります。ここでは、一般的な考え方による年齢を計算しました。

ヒント…VBAでユーザー定義関数を自作する手もある

年齢を求める式は長いので入力が面倒です。データベース内で年齢計算を何度も行う場合は、VBAの知識がある人なら、ユーザー定義関数を自作するほうが早いでしょう。標準モジュールに以下のようなユーザー定義関数[満年齢]を作成すると、クエリの[フィールド]欄に「年齢: 満年齢([生年月日])」と入力するだけで年齢を簡単に求められます。

Function 満年齢(生年月日 As Date) As Integer
    Dim 元旦年齢 As Integer
    元旦年齢 = DateDiff("yyyy", 生年月日, Date)
    If Format(Date, "mmdd") < Format(生年月日, "mmdd"
    Then
        満年齢 = 元旦年齢 - 1
    Else
        満年齢 = 元旦年齢
    End If
End Function
スポンサーリンク

関連記事