Giới thiệu
Khi cột ngày được lưu dưới dạng VARCHAR (chuỗi) với định dạng 'YYYY-MM-DD', có thể dùng toán tử LIKE để lọc theo tháng/năm mà không cần chuyển đổi kiểu.
Ví dụ minh họa
Tạo bảng và chèn dữ liệu
mysql> CREATE TABLE DemoTable (
AdmissionDate VARCHAR(100)
);
mysql> INSERT INTO DemoTable VALUES
('2018-01-21'), ('2019-08-13'), ('2019-07-08'), ('2016-02-12');
Truy vấn lọc tháng 8 năm 2019
mysql> SELECT * FROM DemoTable WHERE AdmissionDate LIKE '2019-08%';
Kết quả
+---------------+ | AdmissionDate | +---------------+ | 2019-08-13 | +---------------+
Phân tích
- Định dạng chuỗi phải nhất quán: 'YYYY-MM-DD'.
LIKE '2019-08%'khớp tất cả ngày trong tháng 8/2019.- Không dùng index hiệu quả (full table scan) vì dùng LIKE với wildcard ở cuối.
Cách tốt hơn: Chuyển đổi và dùng hàm DATE
-- Nếu cột là DATE/DATETIME SELECT * FROM DemoTable WHERE MONTH(AdmissionDate) = 8 AND YEAR(AdmissionDate) = 2019; -- Hoặc dùng BETWEEN (tận dụng index) SELECT * FROM DemoTable WHERE AdmissionDate >= '2019-08-01' AND AdmissionDate < '2019-09-01';
Khuyến nghị
Nên lưu ngày tháng bằng kiểu DATE/DATETIME thay vì VARCHAR để:
- Đảm bảo tính toàn vẹn dữ liệu (invalid date không thể insert).
- Tận dụng index cho truy vấn phạm vi (range query).
- Dùng được các hàm DATE/TIME built-in.