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

【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 を使用すればより安全に処理できます。

  1. MySQLで特定のレコードを先頭に固定し、残りの行を元の順序のまま表示する方法

    MySQLでは、ORDER BY句を工夫して使うことで、特定の条件に一致するレコードを最上位に固定しつつ、それ以外のレコードを元の順序のまま表示できます。この記事では、その具体的な手順をサンプルコードとともに解説します。1. サンプルテーブルの作成まず、テーブルを作成します。mysql> create table DemoTable -> ( -> Id int, -> Name varchar(20) -> ); Query OK, 0 rows affected (0.82 sec)2. レコードの挿入次に、INSERTコマンド

  2. MySQLで日付データから月の初日と末日を取得する方法

    MySQLでは、日付型のカラムから「その月の最初の日」と「最後の日」を簡単に求めることができます。この記事では、実際にテーブルを作成し、サンプルデータを使いながら具体的な手順を解説します。1. テーブルの作成まず、日付を格納するためのテーブルを作成します。mysql> create table DemoTable -> ( -> DueDate date -> ); Query OK, 0 rows affected (0.73 sec)2. レコードの挿入次に、INSERT文を使ってテーブルにいくつかのレコードを挿入します。mysql>