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

MySQLで特定の月のレコードをすべて抽出する方法:monthname()とmonth()関数の使い方

MySQLで特定の月のデータを取得する基本

MySQLである特定の月に該当するレコードだけを取り出したい場合、monthname()関数またはmonth()関数を使用します。日付カラムに対してこれらの関数をWHERE句で条件指定することで、年に関係なく同じ月のエントリをまとめて抽出できます。

基本構文

select *from テーブル名 where monthname(カラム名)='月名';

月名の代わりに月番号を使いたい場合は、次のように記述します。

select *from テーブル名 where month(カラム名)=月番号;

サンプルテーブルの作成

実際に動作を確認するため、出荷日(ShippingDate)を持つテーブルを作成してみましょう。テーブル作成クエリは以下の通りです。

mysql> create table selectAllEntriesDemo
   -> (
   -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
   -> ShippingDate datetime
   -> );
Query OK, 0 rows affected (0.63 sec)

テストデータの挿入

INSERT文を使って、複数の年月にまたがるレコードを挿入します。

mysql> insert into selectAllEntriesDemo(ShippingDate) values('2019-01-21');
Query OK, 1 row affected (0.24 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2018-02-24');
Query OK, 1 row affected (0.15 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2010-10-22');
Query OK, 1 row affected (0.20 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2011-04-12');
Query OK, 1 row affected (0.12 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2013-02-10');
Query OK, 1 row affected (0.18 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2014-02-15');
Query OK, 1 row affected (0.16 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2016-06-14');
Query OK, 1 row affected (0.18 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2017-02-14');
Query OK, 1 row affected (0.51 sec)
mysql> insert into selectAllEntriesDemo(ShippingDate) values('2015-03-29');
Query OK, 1 row affected (0.19 sec)

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

mysql> select *from selectAllEntriesDemo;

実行結果は以下の通りです。9件のレコードが登録されています。

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 1  | 2019-01-21 00:00:00 |
| 2  | 2018-02-24 00:00:00 |
| 3  | 2010-10-22 00:00:00 |
| 4  | 2011-04-12 00:00:00 |
| 5  | 2013-02-10 00:00:00 |
| 6  | 2014-02-15 00:00:00 |
| 7  | 2016-06-14 00:00:00 |
| 8  | 2017-02-14 00:00:00 |
| 9  | 2015-03-29 00:00:00 |
+----+---------------------+
9 rows in set (0.00 sec)

方法1:monthname()関数で月名を指定して抽出

特定の月(ここでは「February=2月」)のエントリをすべて選択するには、以下のクエリを実行します。

mysql> select *from selectAllEntriesDemo where monthname(ShippingDate)='February';

実行結果を見ると、年が異なる2月のレコード4件が正しく抽出されていることがわかります。

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 2  | 2018-02-24 00:00:00 |
| 5  | 2013-02-10 00:00:00 |
| 6  | 2014-02-15 00:00:00 |
| 8  | 2017-02-14 00:00:00 |
+----+---------------------+
4 rows in set (0.00 sec)

方法2:month()関数で月番号を指定して抽出

よりシンプルな代替手段として、month()関数に月番号を渡す方法もあります。2月なら「2」を指定します。

mysql> select *from selectAllEntriesDemo where month(ShippingDate)=2;

実行結果は先ほどと同じく、2月のレコード4件が取得できます。

+----+---------------------+
| Id | ShippingDate        |
+----+---------------------+
| 2  | 2018-02-24 00:00:00 |
| 5  | 2013-02-10 00:00:00 |
| 6  | 2014-02-15 00:00:00 |
| 8  | 2017-02-14 00:00:00 |
+----+---------------------+
4 rows in set (0.04 sec)

使い分けのポイント

  • monthname():英語の月名(January、Februaryなど)で条件を指定したい場合に便利です。可読性が高い反面、ロケール設定によっては意図しない結果になる可能性があります。
  • month():月番号(1〜12)で指定するため、言語環境に依存せず安定して動作します。プログラムから動的に条件を組み立てる場合にも扱いやすいのが特徴です。

なお、特定の「年かつ月」で絞り込みたい場合は、year()関数と組み合わせてwhere year(カラム名)=2024 and month(カラム名)=2のように指定すると、さらに精密な検索が可能です。大量のデータを扱う場合は、関数をカラムに適用するとインデックスが使われなくなる点にも注意しましょう。

  1. MySQLで月ごとにテーブルの合計値を集計する方法

    MySQLで日付データを月単位にグループ化して合計値を求めたい場合、GROUP BY句とMONTH()関数を組み合わせることで簡単に実現できます。この記事では、実際のサンプルを使いながら手順を詳しく解説します。1. サンプルテーブルの作成まず、購入日と金額を格納するテーブルを作成します。mysql> create table DemoTable1628 -> ( -> PurchaseDate date, -> Amount int -> ); Query OK, 0 rows affected (1.55 sec)2. テストデー

  2. MySQLでテーブルの重複を除いたレコードから平均値を取得するクエリの書き方

    MySQLで平均値を求めるには AVG() 関数を使用します。さらに DISTINCT と組み合わせることで、重複しているレコードを除外した状態で平均を計算することができます。この記事では、実際にサンプルテーブルを作成しながら、個別(ユニーク)なレコードから平均値を取得する方法を解説します。サンプルテーブルの作成まず、以下のクエリでテーブルを作成します。mysql> create table DemoTable1934 ( StudentName varchar(20), StudentMarks int ); Query OK, 0 rows affec