Vấn đề
Khi ngày tháng được lưu dưới dạng chuỗi VARCHAR (ví dụ: 'Sunday, 11 August 2019'), bạn không thể so sánh trực tiếp được. Cần chuyển đổi sang kiểu DATE/DATETIME trước khi dùng MAX().
Giải pháp: STR_TO_DATE()
Hàm STR_TO_DATE(str, format) chuyển chuỗi thành DATE theo định dạng chỉ định.
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
('Sunday, 11 August 2019'),
('Friday, 18 October 2019'),
('Thursday, 18 July 2019');
Truy vấn lấy ngày lớn nhất
mysql> SELECT MAX(STR_TO_DATE(AdmissionDate, '%W, %d %M %Y')) AS MaxDate FROM DemoTable;
Kết quả
+------------+ | MaxDate | +------------+ | 2019-10-18 | +------------+
Giải thích định dạng
| Ký tự | Ý nghĩa |
|---|---|
| %W | Tên ngày trong tuần đầy đủ (Sunday, Monday...) |
| %d | Ngày trong tháng (01-31) |
| %M | Tên tháng đầy đủ (January, February...) |
| %Y | Năm 4 chữ số |
Lưu ý quan trọng
- Định dạng trong
STR_TO_DATEphải khớp chính xác với dữ liệu (khoảng trắng, dấu phẩy, chữ hoa/thường). - Nên lưu ngày tháng bằng kiểu DATE/DATETIME thay vì VARCHAR để tránh phiền toái và lỗi so sánh.
- Với dữ liệu lớn, việc chuyển đổi từng dòng khi truy vấn chậm. Cân nhắc thêm cột DATE đã chuyển đổi hoặc view.