MySQL
 Computer >> コンピューター >  >> プログラミング >> MySQL

MySQLで生年月日から年齢を計算する方法をわかりやすく解説

MySQLで生年月日から年齢(歳)を計算する方法

MySQLでは、登録された生年月日をもとに、現在の年齢をSQLだけで簡単に計算できます。ここでは、ユーザー変数と日付関数を組み合わせた基本的な方法を、手順を追って紹介します。

手順1:生年月日をユーザー変数に格納する

まず、SET文を使って生年月日の値をユーザー変数「@dob」に代入します。以下の例では、「1984-01-17」という日付を変数に設定しています。

mysql> SET @dob = '1984-01-17';
Query OK, 0 rows affected (0.00 sec)

このクエリにより、変数「@dob」に生年月日の値が渡されます。実際のアプリケーションでは、テーブルの生年月日カラムを直接参照することも可能です。

手順2:日付関数を使って年齢を計算する

次に、以下のクエリを実行すると、現在の日付と生年月日の差から年齢(満年齢)を求められます。

mysql> SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(CURDATE()) - TO_DAYS(@dob)), '%Y') + 0 AS 'Age in years';
+---------------+
| Age in years  |
+---------------+
|            33 |
+---------------+
1 row in set (0.00 sec)

クエリの仕組み

この計算式で使われている各関数の役割は以下のとおりです。

  • CURDATE():現在の日付を取得します。
  • TO_DAYS():日付を「基準日からの経過日数」に変換します。
  • FROM_DAYS():日数を再び日付に変換します。現在までの日数から生年月日までの日数を引くことで、年齢に相当する日付が得られます。
  • DATE_FORMAT(…, '%Y'):その日付から年(西暦)の部分だけを取り出します。これがそのまま年齢になります。
  • + 0:文字列として返される結果を数値に変換します。

よりシンプルな方法:TIMESTAMPDIFFを使う

MySQL 5.6以降では、TIMESTAMPDIFF()関数を使うことで、より直感的かつ正確に年齢を計算できます。

mysql> SELECT TIMESTAMPDIFF(YEAR, @dob, CURDATE()) AS 'Age in years';
+---------------+
| Age in years  |
+---------------+
|            33 |
+---------------+
1 row in set (0.00 sec)

TIMESTAMPDIFF(YEAR, 開始日, 終了日)は、開始日から終了日までの「満」の年数を返してくれるため、今年の誕生日がまだ来ていない場合でも自動的に正しく処理されます。可読性や保守性を考慮すると、実務ではこちらの方法を使用するのがおすすめです。


  1. MySQLでユーザーの権限を取り消す方法|REVOKE文の基本と実例

    MySQLではREVOKEステートメントを使用することで、ユーザーから特定の権限(1つまたは複数)、あるいはすべての権限を取り消すことができます。この記事では、REVOKE文の基本構文と、実際に権限を取り消す手順を具体例とともに解説します。REVOKE文の基本構文REVOKE privilege_type [(column_list)] [, priv_type [(column_list)]]... ON [object_type] privilege_level FROM user [, user]...構文の各要素は次の通りです。第1段階: REVOKEキーワードの直後に、取り消

  2. MySQLでテーブルの最後の10件のレコードを取得する方法

    MySQLでテーブルの末尾にある10行(最新の10件)を取得したい場合は、SELECT文とLIMIT句を組み合わせたサブクエリを利用します。この記事では、実際にテーブルを作成し、データを挿入しながら、最後の10件を取得するクエリの手順を具体的に解説します。 1. サンプルテーブルの作成 まず、動作確認用のテーブルを作成します。 mysql> create table Last10RecordsDemo -> ( -> id int, -> name varchar(100) -> ); Query OK, 0 rows affected