Khi cột lưu ngày dưới dạng VARCHAR, dùng STR_TO_DATE() chuyển sang DATE/DATETIME rồi so sánh.
Ví dụ minh họa
Tạo bảng (cột VARCHAR):
mysql> CREATE TABLE DemoTable1364 (ShippingDate VARCHAR(100));
Chèn dữ liệu (định dạng dd-mm-yyyy hh:mm:ss):
mysql> INSERT INTO DemoTable1364 VALUES('01-09-2019 12:34:55'), ('01-07-2018 17:10:00'), ('24-09-2019 10:31:22'), ('20-09-2018 13:00:00');
Xem dữ liệu:
mysql> SELECT * FROM DemoTable1364;
+---------------------+ | ShippingDate | +---------------------+ | 01-09-2019 12:34:55 | | 01-07-2018 17:10:00 | | 24-09-2019 10:31:22 | | 20-09-2018 13:00:00 | +---------------------+
Tìm ngày sau '2019-09-21 10:31:20' (chuyển cả 2 vế sang DATETIME):
mysql> SELECT * FROM DemoTable1364
WHERE STR_TO_DATE(ShippingDate, '%d-%m-%Y %H:%i:%s') > STR_TO_DATE('2019-09-21 10:31:20', '%Y-%m-%d %H:%i:%s');
Kết quả (chỉ 24-09-2019):
+---------------------+ | ShippingDate | +---------------------+ | 24-09-2019 10:31:22 | +---------------------+
⚠️ Hiệu năng: STR_TO_DATE() trên cột khiến không dùng được index. Giải pháp:
- Thêm cột DATE/DATETIME mới, cập nhật từ VARCHAR, index cột mới.
- MySQL 8.0: Functional index
INDEX ((STR_TO_DATE(ShippingDate, '%d-%m-%Y %H:%i:%s'))). - Luôn lưu ngày giờ bằng kiểu DATE/DATETIME/TIMESTAMP, không dùng VARCHAR.