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

MySQLで時間に関係なく日付ごとにデータをグループ化する方法

テーブルに同じ日付でも時刻が異なるレコードが複数含まれている場合、GROUP BY DATE() を使えば、時刻を無視して日付単位でデータを簡単にグループ化できます。この記事では、実際にテーブルを作成し、日付ごとのグループ化を行う手順を解説します。

サンプルテーブルを作成する

まず、DATETIME型のカラムを持つテーブルを作成します。

mysql> create table DemoTable692 (DueDatetime datetime);
Query OK, 0 rows affected (0.97 sec)

テストデータを挿入する

次に、INSERT文を使っていくつかのレコードを挿入します。ここでは「2019-07-21」の日付を持つレコードが3件、「2019-06-11」が1件になるようにしています。

mysql> insert into DemoTable692 values('2019-07-21 10:20:00');
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable692 values('2019-06-11 11:00:10');
Query OK, 1 row affected (0.24 sec)
mysql> insert into DemoTable692 values('2019-07-21 11:00:10');
Query OK, 1 row affected (1.97 sec)
mysql> insert into DemoTable692 values('2019-07-21 12:10:10');
Query OK, 1 row affected (0.18 sec)

登録されたレコードを確認する

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

mysql> select *from DemoTable692;

実行結果は以下の通りです。同じ「2019-07-21」でも、時刻が異なる3件のレコードが登録されていることがわかります。

+---------------------+
| DueDatetime |
+---------------------+
| 2019-07-21 10:20:00 |
| 2019-06-11 11:00:10 |
| 2019-07-21 11:00:10 |
| 2019-07-21 12:10:10 |
+---------------------+
4 rows in set (0.00 sec)

時間を無視して日付でグループ化する

ここからが本題です。DATE()関数はDATETIME型の値から日付部分だけを取り出す関数です。これをGROUP BY句で使用することで、時刻に関係なく日付単位でのグループ化が可能になります。

mysql> select *from DemoTable692 GROUP BY DATE(DueDatetime);

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

+---------------------+
| DueDatetime |
+---------------------+
| 2019-07-21 10:20:00 |
| 2019-06-11 11:00:10 |
+---------------------+
2 rows in set (0.00 sec)

4件のレコードが、日付ごとの2つのグループにまとめられました。各グループには最初に現れたレコードが代表として表示されます。

応用:日付ごとの件数を取得する

実務では「日付ごとのレコード数」を集計したいケースも多いでしょう。その場合は以下のようにCOUNT()関数と組み合わせます。

mysql> SELECT DATE(DueDatetime) AS DueDate, COUNT(*) AS Total
-> FROM DemoTable692
-> GROUP BY DATE(DueDatetime);

このように書くことで、日付ごとの件数を明確に把握でき、より実用的な集計結果が得られます。なお、SQLモードでONLY_FULL_GROUP_BYが有効になっている環境では、SELECT句に記述できるのはGROUP BYで指定したカラム(または集計関数)のみとなるため、注意が必要です。

  1. MySQLで文字列を日時(DATETIME)に変換する方法【STR_TO_DATE活用術】

    MySQLでは、STR_TO_DATE()関数とフォーマット指定子を組み合わせることで、VARCHAR型などで文字列として保存されている日付・時刻データを、DATETIME型に変換することができます。 基本構文 フォーマット指定子を使用した基本構文は以下の通りです。 select str_to_date(yourColumnName,%d/%m/%Y %h:%i %p) as anyAliasName from yourTableName; 主なフォーマット指定子の意味 %d:日(2桁) %m:月(2桁) %Y:年(4桁) %h:時(12時間制・2桁) %i:分(2桁) %p:午前/午後

  2. MySQLで日付形式を変換する方法|STR_TO_DATE()関数の使い方を解説

    MySQLでは、VARCHAR型などで保存された文字列の日付データを、正しい日付・時刻形式に変換したいケースがよくあります。そんなときに活躍するのが STR_TO_DATE() 関数です。この記事では、実際のSQL例とともに具体的な使い方を解説します。サンプルテーブルの作成まず、日付を文字列として格納するテーブルを作成します。mysql> create table DemoTable2010 ( DueDate varchar(20) ); Query OK, 0 rows affected (0.68 sec)テストデータの挿入INSERT文を使って、「日/月/年 時:分:秒」