Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Truy vấn MySQL SELECT lọc bản ghi theo tháng và năm cụ thể

Lọc bản ghi theo tháng và năm với MONTH() và YEAR()

Sử dụng hàm MONTH(date) và YEAR(date) trích xuất thành phần tháng/năm từ cột DATE/DATETIME, kết hợp trong WHERE để lọc chính xác.

1. Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    StudentName VARCHAR(40),
    StudentAdmissionDate DATE
);
mysql> INSERT INTO DemoTable VALUES
    ('Chris', '2019-01-21'), ('Robert', '2018-09-05'),
    ('Mike', '2019-09-05'), ('David', '2019-10-04');

2. Xem dữ liệu

mysql> SELECT * FROM DemoTable;
+-------------+----------------------+
| StudentName | StudentAdmissionDate |
+-------------+----------------------+
| Chris       | 2019-01-21           |
| Robert      | 2018-09-05           |
| Mike        | 2019-09-05           |
| David       | 2019-10-04           |
+-------------+----------------------+

3. Truy vấn: Lọc tháng 9 năm 2019

mysql> SELECT * FROM DemoTable
    WHERE MONTH(StudentAdmissionDate) = 09
      AND YEAR(StudentAdmissionDate) = 2019;

4. Kết quả

+-------------+----------------------+
| StudentName | StudentAdmissionDate |
+-------------+----------------------+
| Mike        | 2019-09-05           |
+-------------+----------------------+

Giải thích:

  • MONTH('2019-09-05') = 9
  • YEAR('2019-09-05') = 2019
  • Chỉ Mike thỏa mãn cả 2 điều kiện

Cách hiệu quả hơn (dùng index):

WHERE StudentAdmissionDate >= '2019-09-01'
  AND StudentAdmissionDate < '2019-10-01'

Cách này cho phép MySQL dùng index trên cột StudentAdmissionDate (range scan), trong khi MONTH()/YEAR() không dùng được index.

Mở rộng - Báo cáo theo tháng/năm:

SELECT YEAR(StudentAdmissionDate) AS Year,
       MONTH(StudentAdmissionDate) AS Month,
       COUNT(*) AS StudentCount
FROM DemoTable
GROUP BY YEAR(StudentAdmissionDate), MONTH(StudentAdmissionDate)
ORDER BY Year, Month;