生年月日から満年齢を求める

 ExcelだとDATEDIF関数で簡単に満年齢が算出できます。一方Accessにはよく似た名前のDateDiff関数がありますが、これだと満年齢までは算出できないため少し工夫が必要になります。
 生年月日(「生年月日」列に記録されているものとします)から現在の日付(Date())における満年齢を求める例としては

DateDiff("yyyy",[生年月日],Date())+IIf(Format([生年月日],"mmdd")>Format(Date(),"mmdd"),-1,0)

といったものが挙げられます。まずDateDiff関数で数え年を求め、IIf関数とFormat関数で生まれた月日と現在の月日を比較し、今年の誕生日が来ていない(生まれた月日より現在の月日の方が小さい)のであれば1を引く、というわけです。
 ただ、ちょっと長いので少し切り詰めて

Year(Now())-Year([生年月日])+(Format([生年月日],"mmdd")>Format(Now(),"mmdd"))

 とすることも可能です。DateDiff関数は暦年の差を算出しているに過ぎませんのでYear関数と引き算で代用し、Date関数もNow関数に置き換えています。また、式を評価した結果が真(True)であれば値は-1となるのでIIf関数は省略した(ただしカッコでくくる必要あり)というわけです。

 さらにアプローチを変えた次のような例もあります。
 つまり満月齢を求めて12で割った商を求める、というわけです。

 (DateDiff("m",[生年月日],Now())+(Day([生年月日])>Day(Now())))\12

※ ¥がスラッシュとして表示されているかもしれません。


 なお、DatePart関数により「その年の何日目」という値を求められるため次のようにしても良さそうですが、正確には誤りとなります。

(誤)Year(Now())-Year([生年月日])+(DatePart("y",[生年月日])>DatePart("y",Now()))

 確かにほとんどの場合正しい結果となりますが、うるう年が考慮されていないことが問題です。生年月日の属する年と現在の年のどちらもうるう年でない、あるいはどちらもうるう年であれば結果に誤りは生じません。しかし、どちらか一方のみがうるう年である場合、「その年の何日目」という比較が正確に行われないため、誤った結果となる場合があります。