Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

Sắp xếp theo cột ngày tháng không phải định dạng DATE trong MySQL

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ỗiPattern
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.