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

MySQLでdatetime型のカラムを日付ごとにGROUP BYする方法

MySQLでは、datetime型のカラムを扱う際、時刻情報を無視して「日付単位」でグループ化したいケースがよくあります。例えば、投稿ログを日別に集計したり、同じ日に発生したレコードをまとめて表示したりする場合です。

そのようなときは、GROUP BY句の中で date() 関数を使うことで、datetime値から日付部分だけを取り出してグループ化できます。基本の構文は以下の通りです。

SELECT * FROM テーブル名 GROUP BY date(カラム名);

サンプルテーブルの作成

それでは、実際に動きを確認してみましょう。まずはテスト用のテーブルを作成します。ユーザー名と投稿日時(datetime型)を持つシンプルな構成です。

mysql> CREATE TABLE groupByDateDemo
    -> (
    -> Id int NOT NULL AUTO_INCREMENT PRIMARY KEY,
    -> UserName varchar(20),
    -> UserPostDatetime datetime
    -> );
Query OK, 0 rows affected (0.53 sec)

テストデータの挿入

次に、INSERT文を使っていくつかのレコードを登録します。意図的に同じ日付のデータを複数含めている点に注目してください。

mysql> INSERT INTO groupByDateDemo(UserName,UserPostDatetime) VALUES('Larry','2018-01-02 13:45:40');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO groupByDateDemo(UserName,UserPostDatetime) VALUES('Mike','2018-01-02 13:45:40');
Query OK, 1 row affected (0.14 sec)
mysql> INSERT INTO groupByDateDemo(UserName,UserPostDatetime) VALUES('Sam','2019-01-28 12:30:34');
Query OK, 1 row affected (0.33 sec)
mysql> INSERT INTO groupByDateDemo(UserName,UserPostDatetime) VALUES('David','2019-02-10 11:35:54');
Query OK, 1 row affected (0.18 sec)
mysql> INSERT INTO groupByDateDemo(UserName,UserPostDatetime) VALUES('Maxwell','2019-02-10 11:35:54');
Query OK, 1 row affected (0.21 sec)

登録済みレコードの確認

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

mysql> SELECT * FROM groupByDateDemo;

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

+----+----------+---------------------+
| Id | UserName | UserPostDatetime    |
+----+----------+---------------------+
| 1  | Larry    | 2018-01-02 13:45:40 |
| 2  | Mike     | 2018-01-02 13:45:40 |
| 3  | Sam      | 2019-01-28 12:30:34 |
| 4  | David    | 2019-02-10 11:35:54 |
| 5  | Maxwell  | 2019-02-10 11:35:54 |
+----+----------+---------------------+
5 rows in set (0.00 sec)

date()関数を使って日付ごとにGROUP BYする

ここからが本題です。GROUP BY date() を使って、datetime型のカラムを日付単位でグループ化してみましょう。

mysql> SELECT * FROM groupByDateDemo GROUP BY date(UserPostDatetime);

実行結果は次のようになります。

+----+----------+---------------------+
| Id | UserName | UserPostDatetime    |
+----+----------+---------------------+
| 1  | Larry    | 2018-01-02 13:45:40 |
| 3  | Sam      | 2019-01-28 12:30:34 |
| 4  | David    | 2019-02-10 11:35:54 |
+----+----------+---------------------+
3 rows in set (0.00 sec)

結果のポイント

元のテーブルには5件のレコードがありましたが、結果は3件になっています。これは、「2018-01-02」にLarryとMikeの2件、「2019-02-10」にDavidとMaxwellの2件が存在するため、それぞれ同じ日付として1つのグループにまとめられたからです。

date() 関数はdatetime値から時刻部分を切り捨てて日付のみを返すため、時刻が異なるレコードでも同じ日付なら同一グループとして扱われます。なお、各グループから返されるのは先頭の1件だけなので、件数や合計などの集計を行いたい場合は COUNT()SUM() などの集計関数と組み合わせるのがおすすめです。

  1. JavaとMySQLで現在の日付に月数を追加する方法(INTERVAL句の使い方)

    JavaとMySQLを組み合わせて現在の日付に月数を追加するには、INTERVAL句を使用します。以下がその基本構文です。 String query; query = insert into テーブル名 values(curdate()+interval 追加する月数 month); 現在の日付を確認する まず、curdate()関数を使って現在の日付を確認してみましょう。 mysql> select curdate(); +------------+ | curdate() | +------------+ | 2020-10-25 | +------------+ 1 row in

  2. PythonでMySQLに日付データを挿入する方法をわかりやすく解説

    PythonからMySQLデータベースに日付を挿入するには、まずテーブル側の準備が必要です。挿入先のカラムは DATE 型または DATETIME 型として定義しておきましょう。 日付を文字列に変換してから挿入する MySQLに日付を登録する際は、Pythonのdatetimeオブジェクトをそのまま渡すのではなく、あらかじめ文字列形式に変換しておく必要があります。この変換には、標準ライブラリ datetime モジュールが提供する strftime() メソッドを使うのが一般的です。 コード例 from datetime import datetime now = datetime.now(