Khi cột lưu ngày tháng ở dạng chuỗi (VARCHAR) như 'dd/mm/yyyy', sắp xếp theo thứ tự chữ (alphabetical) sẽ sai. Cần chuyển đổi sang DATE để sắp xếp đúng.
Cú pháp
SELECT * FROM tên_bảng ORDER BY STR_TO_DATE(tên_cột, '%d/%m/%Y') DESC;
Ví dụ minh họa
Tạo bảng với cột ArrivalDatetime kiểu VARCHAR:
mysql> CREATE TABLE orderByDateFormatDemo (
-> Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
-> ArrivalDatetime VARCHAR(100)
-> );
Query OK, 0 rows affected (0.73 sec)
Chèn dữ liệu định dạng dd/mm/yyyy:
mysql> INSERT INTO orderByDateFormatDemo(ArrivalDatetime) VALUES
-> ('01/10/2012'), ('03/11/2010'), ('04/09/2018'),
-> ('31/01/2019'), ('21/04/2017'), ('23/05/2016');
Xem dữ liệu gốc (sắp xếp theo Id):
mysql> SELECT * FROM orderByDateFormatDemo;
+----+-----------------+ | Id | ArrivalDatetime | +----+-----------------+ | 1 | 01/10/2012 | | 2 | 03/11/2010 | | 3 | 04/09/2018 | | 4 | 31/01/2019 | | 5 | 21/04/2017 | | 6 | 23/05/2016 | +----+-----------------+
Sắp xếp giảm dần theo ngày tháng thực tế:
mysql> SELECT * FROM orderByDateFormatDemo
-> ORDER BY STR_TO_DATE(ArrivalDatetime, '%d/%m/%Y') DESC;
+----+-----------------+ | Id | ArrivalDatetime | +----+-----------------+ | 4 | 31/01/2019 | | 3 | 04/09/2018 | | 5 | 21/04/2017 | | 6 | 23/05/2016 | | 1 | 01/10/2012 | | 2 | 03/11/2010 | +----+-----------------+
Các định dạng phổ biến cho STR_TO_DATE
| Định dạng chuỗi | Pattern |
|---|---|
| dd/mm/yyyy | '%d/%m/%Y' |
| yyyy-mm-dd | '%Y-%m-%d' |
| mm/dd/yyyy | '%m/%d/%Y' |
| dd-mm-yyyy | '%d-%m-%Y' |
| dd Month yyyy | '%d %M %Y' |
Khuyến nghị: Nên lưu ngày tháng bằng kiểu DATE/DATETIME/TIMESTAMP thay vì VARCHAR để tránh vấn đề này và tận dụng index.