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で指定したカラム(または集計関数)のみとなるため、注意が必要です。
-
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:午前/午後
-
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文を使って、「日/月/年 時:分:秒」