誕生日から年齢を求める(DateDiff、他)
クエリ上で、誕生日から年齢を求める方法です。DateDiff関数で誕生日から基準日までの年数を求めるのが基本です。
誕生日を求める方法
 誕生日から年齢を求めるには、まずは誕生日から基準日までの年数を求めなくてはなりません。この年数は、DateDiff関数を使い単位に「yyyy」を指定すれば簡単に求められます。

DateDiff("yyyy", 誕生日, 基準日)

 ただし、単純に年数を求めただけでは誕生日が到来していない場合に正しい年齢を求められません。例えば、2005年2月1日〜2006年1月1日までの年数を求めると、DateDiff関数は1と返すためです。そのため、誕生日が到来していない場合は1を引いておかなくてはなりません。ここで便利なのが論理式です。

 論理式は成り立つときに真(True)、成り立たないときは偽(False)を返しますが、TrueとFalseはそれぞれ0(True)、-1(False)という数値として扱えます。ここまでくればお気づきでしょう…この論理式の性質を応用し、誕生日が到来していないことを判断する論理式(誕生日の年月<基準日の年月)の結果を、DateDiff関数で求めた年数に加算すればよいのです。なお、各日付から年月部分を取り出すときはFormat関数が便利です。

DateDiff("yyyy", 誕生日, 基準日) + (Format(誕生日, "mmdd") < Format(基準日, "mmdd"))

 ■DateDiff関数の書式
DateDiff( Interval, Date1, Date2, FirstDayOfWeek, FirstWeekOfYear )
2つの日付/時刻の差の単位を指定します。

■Interval/単位
Date1、Date2の差の単位を次の内容で指定します。
 yyyy: 年
 q  : 四半期
 m  : 月
 y  : 年間通算日
 d  : 日
 ww : 週
 h  : 時
 n  : 分
 s  : 秒

■Date1/自日付時刻
自日付/時刻を指定します。Date1>Date2のときは、差がマイナス値となります。

■Date2/至日付時刻
至日付/時刻を指定します。Date1>Date2のときは、差がマイナス値となります。

■FirstDayOfWeek/先頭曜日
週の先頭とする曜日を指定します。省略時は日曜日(vbSunday)です。
 vbUseSystem (0): NLS APIの設定値を使用する。
 vbSunday  (1): 日曜(既定値)
 vbMonday  (2): 月曜
 vbTuesday  (3): 火曜
 vbWednesday (4): 水曜
 vbThursday (5): 木曜
 vbFriday  (6): 金曜
 vbSaturday (7): 土曜

■FirstWeekOfYear/年度の先頭週
年の先頭とする週を指定します。省略時は1月1日(vbFirstJan1)です。
vbUseSystem   (0): NLS APIの設定値を使用する。
vbFirstJan1   (1): 1月1日を含む週を第1週とする(既定値)
vbFirstFourDays (2): 7日のうち最低4日が新年度に含まれる週を年度の第1週とする。
vbFirstFullWeek (3): 週全体が新年度に含まれる最初の週を第1週として扱う。
誕生日から年齢を求めてみよう
次の例は、上記の方法を使い誕生日から年齢を求めるクエリのサンプルです。誕生日はフィールド「生年月日」に保存されています。また、基準日にはDate関数(=現在)を指定し、現在の年齢を求めるようにしています。

 ■SQLの記述例
SELECT  漢字氏名
       ,生年月日
       ,DateDiff("yyyy", 生年月日, Date())-(Format(生年月日, "mmdd")<Format(Date(), "mmdd"))
  FROM  アドレス帳テーブル
 ※年齢のフィールド名(As 年齢)は、幅が足りないため省略しています

 ■選択クエリの定義例
自作のVBA関数を作成し年齢を求める(応用テクニック)
次のサンプルは、クエリから誕生日から年齢を求める自作のVBA関数を呼び出して年齢を求めるサンプルです。クエリには計算式を記述せず、かわりに自作のVBA関数の呼び出しを定義し、年齢の計算はVBAで作成した関数の中で行います。

誕生日から年齢を求める計算式のように、いろいろなクエリや仕組みで使用できる汎用的な計算式は、このように自作のVBA関数を作成し利用することをおすすめします。

 ■年齢を求める関数の作成例
Public Function GetAge(pBirthday As Date, pDateNow As Date) As Long

    Dim lngAge As Long

    '引数
    '  pBirthday : 誕生日
    '  pDateNow  : 基準日
    '戻り値
    '  年齢(長整数型)

    lngAge = DateDiff("yyyy", pBirthday, pDateNow) _
           - (Format(pBirthday, "mmdd") < Format(pDateNow, "mmdd"))

    GetAge = lngAge

End Function
 ※このプロシージャは標準モジュールへ作成します。

 ■選択クエリの定義例
Copyright(C) 1999-2006 結城圭介。 All rights reserved