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