勉強したことのメモ

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

MySQLにてdate型のカラムから曜日を計算し表示する方法

  MySQL データベース

MySQLにてdateもしくはdatetime型のデータを取り出して曜日もあわせて表示したいような場合、曜日部分のプログラムはPHPで対応していた。今更ながらだけどMySQLで対応できるんじゃないのかと思って調べたところ簡単に対応できた。以下に対応方法をメモ。

 

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

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 |
| ymd | date | NO | | NULL | |
+-------+------+------+-----+---------+----------------+
mysql> SELECT * FROM `test_table`;
+----+------------+
| id | ymd |
+----+------------+
| 1 | 2024-01-01 |
| 2 | 2024-01-02 |
| 3 | 2024-01-03 |
| 4 | 2024-01-04 |
| 5 | 2024-01-05 |
| 6 | 2024-01-06 |
| 7 | 2024-01-08 |
+----+------------+
mysql> SHOW COLUMNS FROM `test_table`; +-------+------+------+-----+---------+----------------+ | Field | Type | Null | Key | Default | Extra | +-------+------+------+-----+---------+----------------+ | id | int | NO | PRI | NULL | auto_increment | | ymd | date | NO | | NULL | | +-------+------+------+-----+---------+----------------+ mysql> SELECT * FROM `test_table`; +----+------------+ | id | ymd | +----+------------+ | 1 | 2024-01-01 | | 2 | 2024-01-02 | | 3 | 2024-01-03 | | 4 | 2024-01-04 | | 5 | 2024-01-05 | | 6 | 2024-01-06 | | 7 | 2024-01-08 | +----+------------+
mysql> SHOW COLUMNS FROM `test_table`;
+-------+------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra          |
+-------+------+------+-----+---------+----------------+
| id    | int  | NO   | PRI | NULL    | auto_increment |
| ymd   | date | NO   |     | NULL    |                |
+-------+------+------+-----+---------+----------------+

mysql> SELECT * FROM `test_table`;
+----+------------+
| id | ymd        |
+----+------------+
|  1 | 2024-01-01 |
|  2 | 2024-01-02 |
|  3 | 2024-01-03 |
|  4 | 2024-01-04 |
|  5 | 2024-01-05 |
|  6 | 2024-01-06 |
|  7 | 2024-01-08 |
+----+------------+

 

対応方法

SQL文

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
SELECT `ymd`,
CASE DAYOFWEEK(`ymd`)
WHEN 1 THEN '日'
WHEN 2 THEN '月'
WHEN 3 THEN '火'
WHEN 4 THEN '水'
WHEN 5 THEN '木'
WHEN 6 THEN '金'
WHEN 7 THEN '土'
END AS week
FROM `test_table`;
SELECT `ymd`, CASE DAYOFWEEK(`ymd`) WHEN 1 THEN '日' WHEN 2 THEN '月' WHEN 3 THEN '火' WHEN 4 THEN '水' WHEN 5 THEN '木' WHEN 6 THEN '金' WHEN 7 THEN '土' END AS week FROM `test_table`;
SELECT `ymd`,
    CASE DAYOFWEEK(`ymd`) 
        WHEN 1 THEN '日' 
        WHEN 2 THEN '月' 
        WHEN 3 THEN '火' 
        WHEN 4 THEN '水' 
        WHEN 5 THEN '木' 
        WHEN 6 THEN '金' 
        WHEN 7 THEN '土' 
    END AS week 
FROM `test_table`;

出力結果

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
+------------+------+
| ymd | week |
+------------+------+
| 2024-01-01 ||
| 2024-01-02 ||
| 2024-01-03 ||
| 2024-01-04 ||
| 2024-01-05 ||
| 2024-01-06 ||
| 2024-01-08 ||
+------------+------+
+------------+------+ | ymd | week | +------------+------+ | 2024-01-01 | 月 | | 2024-01-02 | 火 | | 2024-01-03 | 水 | | 2024-01-04 | 木 | | 2024-01-05 | 金 | | 2024-01-06 | 土 | | 2024-01-08 | 月 | +------------+------+
+------------+------+
| ymd        | week |
+------------+------+
| 2024-01-01 | 月   |
| 2024-01-02 | 火   |
| 2024-01-03 | 水   |
| 2024-01-04 | 木   |
| 2024-01-05 | 金   |
| 2024-01-06 | 土   |
| 2024-01-08 | 月   |
+------------+------+

 

リファレンス

DAYOFWEEK

https://dev.mysql.com/doc/refman/8.0/ja/date-and-time-functions.html#function_dayofweek

 - MySQL データベース

  関連記事

MySQLでwhere句を使ってカラム指定でデータをコピーする方法

MySQLで大量のデータを保存しているテーブルがあり、そのデータを絞った上で尚且 ...

Codeigniter4でMySQLに接続しCRUD操作する方法

Codeigniter4.4.4でMySQLに接続しCRUD操作したい。また、任 ...

MySQLでテーブルのカラム名やカラムの型等、詳細情報を取得する方法

MySQLでテーブルのカラム名やカラムの型等、詳細情報を取得する方法をメモ。 & ...

MySQLで「server has gone~」というエラーの対応方法

MySQLで「MySQL server has gone away」というエラー ...

PHPからMySQLにシリアライズしたデータを格納

アンケートフォームみたいなのがあって、 今後も定期開催し、尚且つ質問内容は増減す ...

S