MySQL
データベース
年齢計算

MySQLで誕生日から年齢を取得する

More than 1 year has passed since last update.

ユーザーの年齢を取得したいという場合に、DB上では誕生日を持っておいて、取得時に計算して年齢を出す、というのが一般的だと思います。

表示で使う際は、プログラム側で関数を作っておいて計算すればいいですが、分析用途やリストの出力のためにSQLでさくっと年齢を出したい!という場合に使える方法をご紹介します。

よりよい方法やバグ等ございましたら、アドバイスいただけると光栄です。


事前準備

年齢計算のクエリを投げるに当たって、テーブル・レコードを作成します。


テーブル

今回は、友達の誕生日一覧のテーブルを作成します。

mysql> DESCRIBE friend;

+----------+------------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+----------+------------------+------+-----+---------+-------+
| id | int(10) unsigned | NO | PRI | NULL | |
| name | varchar(100) | YES | | NULL | |
| birthday | date | YES | | NULL | |
+----------+------------------+------+-----+---------+-------+
3 rows in set, 3 warnings (0.01 sec)


レコード

mysql> SELECT * FROM friend;

+----+-------+------------+
| id | name | birthday |
+----+-------+------------+
| 1 | Aaron | 1988-10-15 |
| 2 | Aimee | 1990-04-24 |
| 3 | Lily | 1998-08-08 |
| 4 | Bryan | 1995-09-02 |
| 5 | Harry | 1993-05-12 |
| 7 | Jimmy | 1978-04-08 |
| 8 | Robin | 1999-01-11 |
| 9 | Sally | 1991-07-12 |
+----+-------+------------+
8 rows in set (0.00 sec)


年齢を取得

誕生日から年齢を取得するには、TIMESTAMPDIFF() 関数を使用します。

引数は、結果を表現する単位、および差を求める 2 つの日付です。


MySQL 5.6 リファレンスマニュアル : : 日付の計算


今回は、「現在の日付」と「誕生日」の差分から、その「年数」を取得できればいいので以下のように使用します。

TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age

それでは、これを使って先程のfriendテーブルで、各友達の年齢を取得してみましょう。

mysql> SELECT id, name, birthday,

-> TIMESTAMPDIFF(YEAR, `birthday`, CURDATE()) AS age
-> FROM friend;
+----+-------+------------+------+
| id | name | birthday | age |
+----+-------+------------+------+
| 1 | Aaron | 1988-10-15 | 29 |
| 2 | Aimee | 1990-04-24 | 27 |
| 3 | Lily | 1998-08-08 | 19 |
| 4 | Bryan | 1995-09-02 | 22 |
| 5 | Harry | 1993-05-12 | 24 |
| 7 | Jimmy | 1978-04-08 | 39 |
| 8 | Robin | 1999-01-11 | 19 |
| 9 | Sally | 1991-07-12 | 26 |
+----+-------+------------+------+
8 rows in set (0.00 sec)

結構シンプルに取り出せます。


気になったこと

ただ、これについて調べていると、以下のような取得の仕方が多くみられました。

(YEAR(CURDATE()) - YEAR(birthday)) - (RIGHT(CURDATE(), 5) < RIGHT(birthday, 5))

これは、

「現在の日付と誕生日の年の差分を取得して、さらに誕生日に達していない場合は1を引く」

って感じになっているんですが、なんでこっちの例が多いんでしょう…。

知っている方がいらっしゃれば、教えて頂きたいです。


※追記(2018/1/23)

コメントで参考になる記事を紹介頂いたので、共有させて頂きます。


まだ年齢計算で消耗してるの?


この記事によれば、生年月日から年齢を計算する簡単な計算式というのがあるそうです。

年齢 = (今日の日付 - 誕生日) / 10000の小数点以下切捨て。

今回のTIMESTAMPDIFF()関数は、まさにこの式に当てはめて作られている関数です。

この計算式を知っていれば、

「現在の日付と誕生日の年の差分を取得して、さらに誕生日に達していない場合は1を引く」

という、面倒な計算をさわさわしなくても問題なさそうです。

※自治体などの法令のしばりなども関係はしてきますが、今回はそれを考えないものとします。


参考資料


MySQL 5.6 リファレンスマニュアル : : 日付の計算

まだ年齢計算で消耗してるの?

佐野裕のサーバ管理者日記 : : 生年月日から年齢を計算する簡単な計算式