HOWTO · MySQL

MySQL で Datetime 列を日付のみでグループ化する

このチュートリアルでは、MySQL でのみ datetime 型の列を日付別にグループ化する方法について説明します。

このページの内容

このチュートリアルでは、GROUP BY 句、COUNT() および DATE() 関数を使用して、MySQL でのみ DATE によって DATETIME 型の列をグループ化します。

GROUP BY、COUNT()、および DATE() を使用して DATETIME 列を DATE でグループ化する MySQL のみ

先に進む前に、DATETIME の値は YYYY-MM-DD hh:mm:ss のように見えるのに対し、DATE の値は YYYY-MM-DD の形式であることを覚えておいてください。 列のデータ型が DATETIME の場合に限り、DATE でデータをグループ化します。

students と student_attendance という名前の 2つのテーブルを作成します。 students テーブルにはすべての生徒に関する基本的な詳細が含まれ、student_attendance テーブルには STUDENT_ID と ATTENDANCE が属性 (列) として含まれています。

学習目的で、以下のクエリを使用して両方のテーブルを作成することもできます。

コード例 (テーブルの作成):

# Create a `students` table
CREATE TABLE students(
   ID INT NOT NULL PRIMARY KEY,
    FIRSTNAME VARCHAR(45) NOT NULL,
    LASTNAME VARCHAR(45) NOT NULL,
    GENDER VARCHAR(10) NOT NULL
);

# Create a `student_attendance` table
CREATE TABLE student_attendance(
    STUDENT_ID INT NOT NULL,
    ATTENDANCE DATETIME NOT NULL,
    FOREIGN KEY (STUDENT_ID) REFERENCES students(ID)
);

コード例 (テーブルへのデータの挿入):

# Insert data into the `students` table
INSERT INTO students (ID, FIRSTNAME, LASTNAME, GENDER)
VALUES
(1, 'Mehvish', 'Ashiq', 'Female'),
(2, 'Thomas', 'Christopher', 'Male'),
(3, 'John', 'Jackson', 'Male');

# Insert data into the `stduent_attendance` table
INSERT INTO student_attendance (STUDENT_ID, ATTENDANCE)
VALUES
(1, '2022-05-02 08:15:10'),
(2, '2022-05-02 08:15:10'),
(3, '2022-05-02 08:15:10'),
(1, '2022-05-03 08:15:10'),
(2, '2022-05-03 08:15:10'),
(3, '2022-05-03 08:15:10'),
(1, '2022-05-04 08:15:10'),
(2, '2022-05-04 08:15:10'),
(3, '2022-05-04 08:15:10'),
(1, '2022-05-05 08:15:10'),
(2, '2022-05-05 08:15:10'),
(3, '2022-05-05 08:15:10'),
(1, '2022-05-06 08:15:10'),
(2, '2022-05-06 08:15:10'),
(3, '2022-05-06 08:15:10');

コード例 (表示データ):

SELECT * from students;
SELECT * from student_attendance;

出力 (students テーブルの場合):

+----+-----------+-------------+--------+
| ID | FIRSTNAME | LASTNAME    | GENDER |
+----+-----------+-------------+--------+
|  1 | Mehvish   | Ashiq       | Female |
|  2 | Thomas    | Christopher | Male   |
|  3 | John      | Jackson     | Male   |
+----+-----------+-------------+--------+
3 rows in set (0.00 sec)

出力 (student_attendance テーブル用):

+------------+---------------------+
| STUDENT_ID | ATTENDANCE          |
+------------+---------------------+
|          1 | 2022-05-02 08:15:10 |
|          2 | 2022-05-02 08:15:10 |
|          3 | 2022-05-02 08:15:10 |
|          1 | 2022-05-03 08:15:10 |
|          2 | 2022-05-03 08:15:10 |
|          3 | 2022-05-03 08:15:10 |
|          1 | 2022-05-04 08:15:10 |
|          2 | 2022-05-04 08:15:10 |
|          3 | 2022-05-04 08:15:10 |
|          1 | 2022-05-05 08:15:10 |
|          2 | 2022-05-05 08:15:10 |
|          3 | 2022-05-05 08:15:10 |
|          1 | 2022-05-06 08:15:10 |
|          2 | 2022-05-06 08:15:10 |
|          3 | 2022-05-06 08:15:10 |
+------------+---------------------+
15 rows in set (0.04 sec)

DATETIME 列を DATE でグループ化する MySQL のみ

月曜日から金曜日までのクラスに何人の学生が出席したかを確認したい。 次のように、DATE のみでグループ化します。

コード例:

SELECT COUNT(STUDENT_ID), DATE(ATTENDANCE)
FROM student_attendance
GROUP BY DATE(student_attendance.ATTENDANCE);

出力:

+-------------------+------------------+
| COUNT(STUDENT_ID) | DATE(ATTENDANCE) |
+-------------------+------------------+
|                 3 | 2022-05-02       |
|                 3 | 2022-05-03       |
|                 3 | 2022-05-04       |
|                 3 | 2022-05-05       |
|                 3 | 2022-05-06       |
+-------------------+------------------+
5 rows in set (0.00 sec)

または、ALIAS を使用して出力を明確にすることもできます。

コード例:

SELECT COUNT(STUDENT_ID) AS NumbOfStudents, DATE(ATTENDANCE) AS DateOnly
FROM student_attendance
GROUP BY DATE(DateOnly);

出力:

+----------------+------------+
| NumbOfStudents | DateOnly   |
+----------------+------------+
|              3 | 2022-05-02 |
|              3 | 2022-05-03 |
|              3 | 2022-05-04 |
|              3 | 2022-05-05 |
|              3 | 2022-05-06 |
+----------------+------------+
5 rows in set (0.00 sec)

DATETIME 型を DATE にキャストするのは、上記のクエリの目的を達成するためだけです。 以下で簡単に説明するさまざまな関数と句を使用しました。

MySQL COUNT() 関数

COUNT() は、式のカウントを返すために使用する 集計関数 です。 特定の条件を満たすすべてのテーブル レコードをカウントできます。

COUNT() 関数の戻り値の型は BIGINT です。 テーブルに一致するレコードがない場合は 0 を返します。

SELECT ステートメントで COUNT() 関数を使用する方法は 3つあります。

  1. カウント (*) - このフォームによって生成される出力には、すべての重複、NULL、および NOT NULL 値が含まれます。
  2. Count (expression) - この COUNT() 関数によって返されるレコードの数には NULL 値がありません。
  3. Count (distinct) - NULL 値を持たない個別レコードの数を式の結果として返します。

MySQL DATE() 関数

DATE() メソッドは、DATETIME 式から DATE のみを抽出します。 式が有効な DATETIME または DATE 値でない場合、NULL が返されます。

MySQL GROUP BY 句

GROUP BY 句は、同じ値を持つレコードを要約レコードにグループ化できます。 たとえば、クラスに出席している生徒の数を見つけます。

このステートメントを集計関数と共に使用して、出力を単一または複数のフィールド (列) でグループ化します。