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

MySQLで月別・年別にデータをグループ化する方法(DATE_FORMAT関数の使い方)

MySQLでは、DATE_FORMAT()関数を使用することで、日付データを月別・年別にグループ化することができます。これに加えて、GROUP BY句を組み合わせることで、集計や一覧表示が簡単に行えます。

基本構文

月と年でグループ化する場合の基本的な構文は以下の通りです。

SELECT DATE_FORMAT(カラム名, '%m-%Y') FROM テーブル名
GROUP BY MONTH(カラム名), YEAR(カラム名) DESC;

%m-%Yは「月-年」の形式で表示することを意味し、DESCを指定することで降順(新しい年から)に並べ替えられます。

サンプルテーブルの作成

それでは、実際に動作を確認してみましょう。まず、以下のクエリでテーブルを作成します。

mysql> create table GroupMonthAndYearDemo
   -> (
   -> DueDate datetime
   -> );
Query OK, 0 rows affected (1.49 sec)

レコードの挿入

次に、NOW()関数やDATE_ADD()関数を使って、現在の日付を基準とした複数のレコードを挿入します。

mysql> insert into GroupMonthAndYearDemo values(now());
Query OK, 1 row affected (0.11 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval 2 year));
Query OK, 1 row affected (0.12 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval -2 year));
Query OK, 1 row affected (0.10 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval 1 year));
Query OK, 1 row affected (0.16 sec)

mysql> insert into GroupMonthAndYearDemo values(date_add(now(),interval -1 year));
Query OK, 1 row affected (0.14 sec)

登録データの確認

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

mysql> select *from GroupMonthAndYearDemo;

実行結果は以下の通りです。

+---------------------+
| DueDate             |
+---------------------+
| 2018-12-06 13:12:34 |
| 2020-12-06 13:12:59 |
| 2016-12-06 13:13:08 |
| 2019-12-06 13:13:14 |
| 2017-12-06 13:13:19 |
+---------------------+
5 rows in set (0.00 sec)

月と年でグループ化するクエリ

それでは、本題である「月と年によるグループ化」を実行してみます。

mysql> select DATE_FORMAT(DueDate, '%m-%Y') from GroupMonthAndYearDemo 
   -> GROUP BY MONTH(DueDate), YEAR(DueDate) DESC;

実行結果は以下のようになります。GROUP BYによって月と年がグループ化され、年が降順で表示されていることがわかります。

+-------------------------------+
| DATE_FORMAT(DueDate, '%m-%Y') |
+-------------------------------+
| 12-2020                       |
| 12-2019                       |
| 12-2018                       |
| 12-2017                       |
| 12-2016                       |
+-------------------------------+
5 rows in set, 2 warnings (0.00 sec)

補足:より安全な書き方

上記の例では警告(warnings)が表示されています。これはGROUP BYの指定方法に関連するものです。より確実にグループ化したい場合は、SELECT句と同じ式をGROUP BYに指定するか、以下のように書くことをおすすめします。

mysql> select DATE_FORMAT(DueDate, '%m-%Y') as MonthYear 
   -> from GroupMonthAndYearDemo
   -> group by MonthYear
   -> order by Year(DueDate) desc;

このようにDATE_FORMAT()とGROUP BYを組み合わせれば、売上の月次集計やログの年別分析など、さまざまな場面で活用できます。

  1. MySQLでタイムスタンプを月に変換するクエリの書き方

    タイムスタンプを月に変換する基本構文MySQLでタイムスタンプ(UNIXタイムスタンプ)を月に変換するには、FROM_UNIXTIME()関数とMONTH()関数を組み合わせて使用します。基本的な構文は以下の通りです。select month(from_unixtime(yourColumnName)) from yourTableName;FROM_UNIXTIME()関数がUNIXタイムスタンプを日時形式に変換し、その結果に対してMONTH()関数を適用することで、月の数値(1〜12)を取得できます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> cr

  2. MySQLで特定の月と年に基づいてレコードを取得する方法

    MySQLで特定の月と年に基づいてレコードを取得する方法日付データから特定の月と年に該当するレコードだけを抽出したい場合、MySQLの MONTH() 関数と YEAR() 関数を組み合わせて使用します。ここでは、実際にテーブルを作成し、データを挿入して、条件に合うレコードを取得するまでの手順を具体的に解説します。1. サンプルテーブルの作成まず、日付型(DATE)のカラムを持つテーブルを作成します。mysql> create table DemoTable1846     (     PurchaseDat