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')= 9YEAR('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;