勉強したことのメモ

Webエンジニア / プログラマが勉強したことのメモ。

MySQLにてSELECT時にdate型のカラムから和暦を計算し表示する方法

  MySQL データベース

MySQLにdate型のカラムに誕生年月日が格納されており、そこから和暦を計算して取得したい。また、date型だと基本的には「YYYY-MM-DD」もしくは「YYYY/MM/DD」形式だと思うが、これを「〇〇Y年M月D日」に整形して表示したい。以下に対応方法をメモ。

 

テーブル構造とデータ内容

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
mysql> SHOW COLUMNS FROM `test_table`;
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int | NO | PRI | NULL | auto_increment |
| name | varchar(255) | NO | | NULL | |
| birthday | date | NO | | NULL | |
+----------+--------------+------+-----+---------+----------------+
mysql> SELECT * FROM `test_table`;
+----+-----------+------------+
| id | name | birthday |
+----+-----------+------------+
| 1 | 山田 | 2020-01-01 |
| 2 | 鈴木 | 1990-05-05 |
| 3 | 佐々木 | 1980-12-31 |
+----+-----------+------------+
mysql> SHOW COLUMNS FROM `test_table`; +----------+--------------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +----------+--------------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | name | varchar(255) | NO | | NULL | | | birthday | date | NO | | NULL | | +----------+--------------+------+-----+---------+----------------+ mysql> SELECT * FROM `test_table`; +----+-----------+------------+ | id | name | birthday | +----+-----------+------------+ | 1 | 山田 | 2020-01-01 | | 2 | 鈴木 | 1990-05-05 | | 3 | 佐々木 | 1980-12-31 | +----+-----------+------------+
mysql> SHOW COLUMNS FROM `test_table`;
+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int          | NO   | PRI | NULL    | auto_increment |
| name     | varchar(255) | NO   |     | NULL    |                |
| birthday | date         | NO   |     | NULL    |                |
+----------+--------------+------+-----+---------+----------------+

mysql> SELECT * FROM `test_table`;
+----+-----------+------------+
| id | name      | birthday   |
+----+-----------+------------+
|  1 | 山田      | 2020-01-01 |
|  2 | 鈴木      | 1990-05-05 |
|  3 | 佐々木    | 1980-12-31 |
+----+-----------+------------+

 

対応方法

SQL文

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT `birthday`,
CASE
WHEN `birthday` > '2019-04-30' THEN CONCAT('令和', YEAR(`birthday`) - 2018, date_format(`birthday`, '年%c月%e日'))
WHEN `birthday` > '1989-01-07' THEN CONCAT('平成', YEAR(`birthday`) - 1988, date_format(`birthday`, '年%c月%e日'))
WHEN `birthday` > '1926-12-24' THEN CONCAT('昭和', YEAR(`birthday`) - 1925, date_format(`birthday`, '年%c月%e日'))
WHEN `birthday` > '1912-07-29' THEN CONCAT('大正', YEAR(`birthday`) - 1911, date_format(`birthday`, '年%c月%e日'))
WHEN `birthday` > '1868-01-24' THEN CONCAT('明治', YEAR(`birthday`) - 1867, date_format(`birthday`, '年%c月%e日'))
END AS `birthday_wareki`
FROM `test_table`;
SELECT `birthday`, CASE WHEN `birthday` > '2019-04-30' THEN CONCAT('令和', YEAR(`birthday`) - 2018, date_format(`birthday`, '年%c月%e日')) WHEN `birthday` > '1989-01-07' THEN CONCAT('平成', YEAR(`birthday`) - 1988, date_format(`birthday`, '年%c月%e日')) WHEN `birthday` > '1926-12-24' THEN CONCAT('昭和', YEAR(`birthday`) - 1925, date_format(`birthday`, '年%c月%e日')) WHEN `birthday` > '1912-07-29' THEN CONCAT('大正', YEAR(`birthday`) - 1911, date_format(`birthday`, '年%c月%e日')) WHEN `birthday` > '1868-01-24' THEN CONCAT('明治', YEAR(`birthday`) - 1867, date_format(`birthday`, '年%c月%e日')) END AS `birthday_wareki` FROM `test_table`;
SELECT `birthday`, 
    CASE 
        WHEN `birthday` > '2019-04-30' THEN CONCAT('令和', YEAR(`birthday`) - 2018, date_format(`birthday`, '年%c月%e日'))
        WHEN `birthday` > '1989-01-07' THEN CONCAT('平成', YEAR(`birthday`) - 1988, date_format(`birthday`, '年%c月%e日'))
        WHEN `birthday` > '1926-12-24' THEN CONCAT('昭和', YEAR(`birthday`) - 1925, date_format(`birthday`, '年%c月%e日'))
        WHEN `birthday` > '1912-07-29' THEN CONCAT('大正', YEAR(`birthday`) - 1911, date_format(`birthday`, '年%c月%e日'))
        WHEN `birthday` > '1868-01-24' THEN CONCAT('明治', YEAR(`birthday`) - 1867, date_format(`birthday`, '年%c月%e日'))
    END AS `birthday_wareki`
FROM `test_table`;

出力結果

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+------------+-----------------------+
| birthday | birthday_wareki |
+------------+-----------------------+
| 2020-01-01 | 令和211|
| 1990-05-05 | 平成255|
| 1980-12-31 | 昭和551231|
+------------+-----------------------+
+------------+-----------------------+ | birthday | birthday_wareki | +------------+-----------------------+ | 2020-01-01 | 令和2年1月1日 | | 1990-05-05 | 平成2年5月5日 | | 1980-12-31 | 昭和55年12月31日 | +------------+-----------------------+
+------------+-----------------------+
| birthday   | birthday_wareki       |
+------------+-----------------------+
| 2020-01-01 | 令和2年1月1日         |
| 1990-05-05 | 平成2年5月5日         |
| 1980-12-31 | 昭和55年12月31日      |
+------------+-----------------------+

 

参考サイト

https://note.com/maiyamashita/n/n2c6d5f319a64

 - MySQL データベース

  関連記事

MySQLのREGEXPで半角記号を検索したい場合の対応方法

MySQLのREGEXPで半角記号を検索したい場合\\を付けてエスケープしないと ...

MySQLでテーブル構造とデータをコピーする方法

MySQLで既にあるテーブルとデータに対して実験を行う必要があった。本番テーブル ...

MySQLにて直近のクエリで発行されたAUTO_INCREMENTの値を取得する方法

やりたかったことは「MySQLで新規登録(INSERT)なら、登録時のAUTO_ ...

MySQLで大文字小文字

半角英数字のみのフォームで入力した値を検索した際、 データに差異が発生。 [Aa ...

MySQLのバックアップファイルを簡単に作成できるライブラリ「myphp-backup」の利用方法

MySQLのバックアップを取る際にadminerとかから手動で対応するのではなく ...

S