【MySQL】日付レコードから曜日を減算し、曜日名とともに結果を表示する方法
はじめに
MySQLで保存された日付レコードから、その週の開始日(月曜日)を計算して減算し、曜日名とともに結果を表示したい場合があります。このような処理には DATE_FORMAT() 関数を使用します。SUBDATE() と WEEKDAY() を組み合わせることで、各日付が属する週の月曜日の日付を「Mon 19 Oct」のような形式で取得できます。
以下、具体的な手順をサンプルコードとともに解説します。
1. テーブルの作成
まず、日付を文字列として格納するテーブルを作成します。
mysql> create table DemoTable1820
(
AdmissionDate varchar(20)
);
Query OK, 0 rows affected (0.00 sec)2. レコードの挿入
INSERT文を使って、テーブルにいくつかの日付レコードを挿入します。ここでは「日/月/年」形式の文字列として登録しています。
mysql> insert into DemoTable1820 values('20/10/2019');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1820 values('19/12/2018');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1820 values('16/04/2017');
Query OK, 1 row affected (0.00 sec)3. 登録データの確認
SELECT文で、テーブル内のすべてのレコードを表示して確認しましょう。
mysql> select * from DemoTable1820;
実行すると、次のような出力が得られます。
+---------------+ | AdmissionDate | +---------------+ | 20/10/2019 | | 19/12/2018 | | 16/04/2017 | +---------------+ 3 rows in set (0.00 sec)
4. 曜日を減算して月曜日の日付を表示するクエリ
それでは本題のクエリです。STR_TO_DATE() で文字列を日付型に変換し、WEEKDAY() で取得した曜日番号(月曜日=0)分だけ SUBDATE() で減算することで、その週の月曜日の日付を求めます。最後に DATE_FORMAT() で「%a %d %b」(曜日の省略形 日 月の省略形)の形式に整形して表示します。
mysql> select DATE_FORMAT(SUBDATE(STR_TO_DATE(AdmissionDate,'%d/%m/%y'), WEEKDAY(STR_TO_DATE(AdmissionDate,'%d/%m/%y'))), '%a %d %b') from DemoTable1820;
このクエリを実行すると、次のような出力が得られます。
+-------------------------------------------------------------------------------------------------------------------------+ | DATE_FORMAT(SUBDATE(STR_TO_DATE(AdmissionDate,'%d/%m/%y'), WEEKDAY(STR_TO_DATE(AdmissionDate,'%d/%m/%y'))), '%a %d %b') | +-------------------------------------------------------------------------------------------------------------------------+ | Mon 19 Oct | | Mon 14 Dec | | Mon 13 Apr | +-------------------------------------------------------------------------------------------------------------------------+ 3 rows in set, 6 warnings (0.00 sec)
クエリのポイント
- STR_TO_DATE(): 「20/10/2019」のような文字列を
%d/%m/%y形式指定子で日付値に変換します。 - WEEKDAY(): 月曜日を0、日曜日を6とする曜日番号を返します。これにより、どの曜日の日付でも必ず同じ週の月曜日に変換されます。
- SUBDATE(): 元の日付から曜日番号の日数を引くことで、週の初日(月曜日)を算出します。
- DATE_FORMAT(): 結果を見やすい「Mon 19 Oct」形式に整形します。
なお、サンプルでは年を2桁の %y で扱っているため警告(warnings)が表示されていますが、4桁の %Y を使用すればより安全に処理できます。
-
MySQLで特定のレコードを先頭に固定し、残りの行を元の順序のまま表示する方法
MySQLでは、ORDER BY句を工夫して使うことで、特定の条件に一致するレコードを最上位に固定しつつ、それ以外のレコードを元の順序のまま表示できます。この記事では、その具体的な手順をサンプルコードとともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.82 sec)2. レコードの挿入次に、INSERTコマンド
-
MySQLで日付データから月の初日と末日を取得する方法
MySQLでは、日付型のカラムから「その月の最初の日」と「最後の日」を簡単に求めることができます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、日付を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> DueDate date -> ); Query OK, 0 rows affected (0.73 sec)2. レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql>