Webシステムで今の年齢を使う場合、データベースに生年月日を登録しておき、その日付と今日の日付から年齢を計算するのが一般的です。そして、年齢はSQLでも計算できます。
ただし、データベース管理ソフトによっては、年齢計算で使う関数が違うなど、単純ではありません。そこで今回は、SQLを使った年齢計算のやり方を、データベース管理ソフトによる違うも含めて解説します。
年齢計算の仕組み
情報システムで表示するプロフィールなどに年齢を表示する場合、生年月日を登録してもらい、それを基に計算します。そして、生年月日がデータベースに格納されている場合、もちろんプログラム側で計算もできますが、SQLで年齢を計算させて、そのままプログラム側で使うことも可能です。
まずは、生年月日から年齢を計算する仕組みについて解説します。
一般的な年齢の計算方法
一般的に使われている年齢の計算方法は、生まれた年を0歳とし、その翌年以降の誕生日に年齢に1を加えます。なお、コンピュータには、時計の機能が組み込まれていおり、プログラムなどで簡単に今日の日付を取得できます。そのため、今日の日付から生年月日を引いて、それが何年にあたるかを計算することで簡単に年齢が算出できます。
では、もし、誕生日に年齢を計算したとして、何時から1を加えた年齢になるのでしょうか。正解は、その日の午前0時です。これは、コンピュータが秒単位で時間をチェックしており、通常、生年月日を登録すると、その日の午前0時0分0秒と登録されます。そのため、比較した時点の秒単位で比較することになるので、誕生日の午前0時から1を加えた年齢が計算されます。
民法の年齢は誕生日の前日に+1
先ほど解説したように、一般的な計算方法では誕生日になってから年齢に1を加えますが、民法の計算方法はちょっと違います。生まれた年を0歳とするのはいっしょでですが、翌年以降は、誕生日の前日に年齢に1を加える計算方法を使います。
これは、民法では、年齢に1を加えるのは前日の24時と決められているのが原因です。なお、法律は、その日のある時刻から適用される場合でも、効果を発揮するのはその日の午前0時からです。そのため、法律の効果は、誕生日の前日が始まった時点から適用されます。
そのため、役所などの法律に従って年齢計算をする情報システムのプログラムでは、誕生日ではなく、その前日に年齢に1を加えて計算するケースがあります。
数えの年の計算方法
年齢を聞かれて、数えで何歳、と答えているのを聞いたことがあるでしょう。七五三のお祝いや長寿のお祝いなどは、昔から数えの年が使われてきました。
この数えの年とは、生まれた年の1月1日を1歳とし、翌年の1月1日から年齢に1を加える年齢の数え方です。昔の日本では、この年齢の数え方をしていました。そのため、七五三のお祝いや長寿のお祝いなどでは、数え年が使われます。
なお、今の情報システムでは、数え年を計算する必要はないかもしれませんが、一般常識として覚えておきましょう。
SQLで年齢を計算するには
SQLでは、日付や時間を格納するためのデータ型があり、それを使って日付や時間を計算させたり、検索条件としても利用できます。
しかし、年齢を計算する関数がどのデータベース管理ソフトでも使える訳ではありません。SQLを組み合わせて年齢を計算するのが一般的です。次から、SQLを使って年齢を計算する手順について紹介します。
SQLによる一般的な年齢を計算する方法
年齢を計算するには、今日の日付と生年月日から年を西暦で取り出し、その差を計算し、さらに、今日が生年月日に達していない場合は、その差から1を引きます。
なお、SQLには、日付のデータ型で登録された生年月日から年を西暦で取り出す関数があり、SQLが使えるデータベース管理ソフトのほとんどで利用できます。また、年と同じように何月何日かを4桁の数字で取り出し、比較することで、生年月日に達しているかをチェックできます。
生年月日から年齢を算出するSQLの例 SELECT EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM 誕生日) - CASE WHEN TO_CHAR(SYSDATE, 'MMDD') < TO_CHAR(誕生日, 'MMDD') THEN 1 ELSE 0 END AS 年齢 FROM テーブル名 ;
組み込み関数を利用する
SQLは国際標準が決められており、データベース管理ソフトはその国際標準のSQLが動作するように作られています。しかし、国際標準のSQLが全て動作するとは限りません。さらに、データベース管理ソフト独自の機能が組み込まれていたりします。
特に日付や時間に関しては独自の機能が多く、別のデータベース管理ソフトでSQLを使おうしても、独自機能が含まれているせいで、動作しないケースが珍しくありません。
年齢計算に関しては、MySQLの独自の関数であるTIMESTAMPDIFF関数を使うことで、簡単に計算できます。ただし、この関数は、他のデータベース管理ソフトでは使えないので注意してください。
TIMESTAMPDIFF関数による年齢計算の例 TIMESTAMPDIFF(YEAR, 生年月日, CURDATE()) AS age
この例では、DATE型の「生年月日」に格納されている生年月日と、CURDATE()で取得した今日の日付の差を計算し、年数で表示しています。
また、postgresqlのage関数でも、同じように青年月日と今日の日付の差を計算できます。ただし、戻り値が時間間隔を表すinterval型になるので、年数だを取り出すには、extract関数を組み褪せる必要があります。
age関数による年齢計算の例 select extract(year from age(current_date, 生年月日));
日付の差分を計算して年齢を求める方法
先ほど、一般的な年齢を計算する方法を紹介しましたが、生年月日を8桁の数字に変換して比較すれば、もっと簡単に計算できます、次からこの方法について詳しく紹介します。
年月日を8桁の数字にして計算する
SQLで、簡単に年齢を計算する方法としてよく使われるのが、月日を8桁の数字にし、誕生日が過ぎているかを含めて、年に相当する4桁で年数を計算する方法です。例えば、2019年4月30日を20190430とし、1989年1月8日を19890108として、その差を計算し、10000で割って小数点以下を切り捨てれば、年数が簡単に計算できます。
pre class=”theme:eclipse lang:default decode:true”>
年月日を8桁の数字にして計算する例
20190430 – 19890108 = 300322
322322 / 10000 = 30.0322
30.0322から小数点以下を切り捨てると、30
SQLの小数点以下を切り捨てる関数trunc()を使えば、上の例で紹介した計算を次のように書けます。
trunc((20100430 - 19890108)/10000,0)
先ほど紹介した年月日を8桁の数字にして計算する方法を使って年齢を計算するには、DATE型で格納された生年月日から、8桁の数字を作らなければなりません。しかし、これはデータベース管理ソフトによって違っています。
例えばOracleの場合、DATE型のデータから8桁の数字に変換する関数は、TO_CAHR()です。これを使うことで、次のようなSQLが書けます。
trunc((TO_CHAR(今日の日付, 'YYYYMMDD') - TO_CHAR(生年月日, 'YYYYMMDD')/10000,0)
日数計算の組み込み関数を利用する
データベース管理ソフトの独自機能の中には、2つのDATE型データから、その月数を計算する関数があります。これを使うことで、先ほど紹介した8桁の数字に変換する方法と同じように年齢計算が可能です。
次の例は、Oracle独自の関数、MONTHS_BETWEENを使った例です。
MONTHS_BETWEENを使った例 SELECT TRUNC (MONTHS_BETWEEN (SYSDATE,TO_DATE(生年月日,'YYYY/MM/DD')) /12) FROM DUAL;
まとめ
これまで解説したように、SQLで年齢を計算する方法が幾つもあります。ただし、官公庁向けのシステムでは、民法に合わせた計算方法が必要であり、組み込み関数で簡単に計算できる訳ではありません。さらに、データベース管理ソフトが変われば、年齢計算用のSQLが動作しないこともあります。
もし、WebシステムなどからSQLで呼び出す場合は、プログラム側で計算することも検討してください。もちろん、データベース管理ソフトで計算して利用することも可能です。ぜひ、仕様に合わせて、年齢を計算するSQLが組めるようにスキルアップを目指しましょう。