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を組み合わせれば、売上の月次集計やログの年別分析など、さまざまな場面で活用できます。
-
MySQLでタイムスタンプを月に変換するクエリの書き方
タイムスタンプを月に変換する基本構文MySQLでタイムスタンプ(UNIXタイムスタンプ)を月に変換するには、FROM_UNIXTIME()関数とMONTH()関数を組み合わせて使用します。基本的な構文は以下の通りです。select month(from_unixtime(yourColumnName)) from yourTableName;FROM_UNIXTIME()関数がUNIXタイムスタンプを日時形式に変換し、その結果に対してMONTH()関数を適用することで、月の数値(1〜12)を取得できます。サンプルテーブルの作成まず、動作確認用のテーブルを作成しましょう。mysql> cr
-
MySQLで特定の月と年に基づいてレコードを取得する方法
MySQLで特定の月と年に基づいてレコードを取得する方法日付データから特定の月と年に該当するレコードだけを抽出したい場合、MySQLの MONTH() 関数と YEAR() 関数を組み合わせて使用します。ここでは、実際にテーブルを作成し、データを挿入して、条件に合うレコードを取得するまでの手順を具体的に解説します。1. サンプルテーブルの作成まず、日付型(DATE)のカラムを持つテーブルを作成します。mysql> create table DemoTable1846 ( PurchaseDat