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

MySQLで月の範囲を指定してレコードを取得する方法

MySQLでは、YEAR()関数とMONTH()関数、さらにBETWEEN演算子を組み合わせることで、特定の月の範囲に該当するレコードを簡単に抽出できます。ここでは、前年の7月〜12月と当年の1月〜7月というように、年をまたいだ月の範囲でデータを取得する方法を解説します。

サンプルテーブルの作成

まず、テーブルを作成します。

mysql> create table DemoTable1795
     (
     Name varchar(20),
     DueDate date
     );
Query OK, 0 rows affected (0.00 sec)

テストデータの挿入

次に、INSERT文を使っていくつかのレコードを挿入します。

mysql> insert into DemoTable1795 values('John','2018-07-21');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1795 values('Sam','2019-10-21');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1795 values('Sam','2019-01-10');
Query OK, 1 row affected (0.00 sec)
mysql> insert into DemoTable1795 values('Mike','2018-12-31');
Query OK, 1 row affected (0.00 sec)

登録済みレコードの確認

SELECT文ですべてのレコードを表示してみましょう。

mysql> select * from DemoTable1795;

実行すると、以下のような結果が得られます。

+------+------------+
| Name | DueDate    |
+------+------------+
| John | 2018-07-21 |
| Sam  | 2019-10-21 |
| Sam  | 2019-01-10 |
| Mike | 2018-12-31 |
+------+------------+
4 rows in set (0.00 sec)

月の範囲でレコードを抽出するクエリ

ここが本題です。次のクエリを実行すると、「前年の7月〜12月」または「当年の1月〜7月」に該当するレコードだけを取得できます。

mysql> select * from DemoTable1795
     where (YEAR(DueDate) = YEAR(DATE_SUB(CURDATE(), INTERVAL 1 YEAR))
         AND MONTH(DueDate) BETWEEN 7 AND 12)
     OR (YEAR(DueDate) = YEAR(CURRENT_DATE())
         AND MONTH(DueDate) BETWEEN 1 AND 7);

このクエリのポイントは以下の通りです。

  • DATE_SUB(CURDATE(), INTERVAL 1 YEAR)で現在の日付から1年前の日付を算出し、その年のレコードを対象にします。
  • MONTH(DueDate) BETWEEN 7 AND 12で7月〜12月の範囲を指定します。
  • OR以降の条件で、当年の1月〜7月のレコードも合わせて取得します。

実行結果は以下のようになります。

+------+------------+
| Name | DueDate    |
+------+------------+
| John | 2018-07-21 |
| Sam  | 2019-01-10 |
| Mike | 2018-12-31 |
+------+------------+
3 rows in set (0.00 sec)

このように、条件に合致しない「Sam(2019-10-21)」が除外され、指定した月の範囲内にある3件のレコードのみが正しく取得できていることがわかります。なお、この手法はDUE_DATEカラムに関数を適用しているためインデックスが効きにくい点に注意してください。大量のデータを扱う場合は、日付範囲を直接比較する形式(例:DueDate >= '2018-07-01' AND DueDate < '2019-08-01')に書き換えるとパフォーマンス面で有利になります。

  1. 【MySQL】現在の日付+2週間より前のレコードを取得するクエリの書き方

    MySQLでは、CURDATE()関数とDATE_ADD()関数を組み合わせることで、「現在の日付+2週間」よりも前の日付を持つレコードを簡単に抽出できます。この記事では、サンプルテーブルを作成しながら、具体的な手順と実行結果をわかりやすく解説します。基本となる構文今回使用する基本構文は以下のとおりです。select * from yourTableName where yourColumnName < DATE_ADD(CURDATE(), INTERVAL 2 WEEK);現在の日付の確認注:この記事では現在の日付を「2019-10-20」として進めます。まず実際に確認しておきましょ

  2. MySQLのDELETE文とIN句を組み合わせて1つのクエリで複数レコードを削除する方法

    MySQLでは、IN()句を活用することで、複数の条件値に一致するレコードを1つのDELETEクエリでまとめて削除できます。個別に削除クエリを実行する必要がなく、効率的なデータ操作が可能になります。ここでは、サンプルテーブルを作成し、実際にIN()句を使ったレコード削除の手順を解説します。1. サンプルテーブルの作成まず、テーブルを作成しましょう。mysql> create table DemoTable1922 ( StudentId int NOT NULL AUTO_INCREMENT PRIMARY KEY, StudentName varchar(20)