Kết hợp DATEDIFF() để tính chênh lệch ngày và ORDER BY CASE để sắp xếp: ngày tương lai gần nhất trước, ngày quá khứ sau đó.
Ví dụ minh họa
Ngày hiện tại: 2019-06-09 21:08:16.
Tạo bảng:
mysql> CREATE TABLE DemoTable (
Id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
DueDate DATETIME
);
Chèn dữ liệu:
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-12');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-01');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-05');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-10');
mysql> INSERT INTO DemoTable(DueDate) VALUES('2019-06-11');
Xem dữ liệu:
mysql> SELECT * FROM DemoTable;
Kết quả
+----+---------------------+ | Id | DueDate | +----+---------------------+ | 1 | 2019-06-12 00:00:00 | | 2 | 2019-06-01 00:00:00 | | 3 | 2019-06-05 00:00:00 | | 4 | 2019-06-10 00:00:00 | | 5 | 2019-06-11 00:00:00 | +----+---------------------+
Truy vấn: Tính chênh lệch ngày (t), sắp xếp ngày tương lai (t ≥ 0) trước, sau đó ngày quá khứ (t < 0), mỗi nhóm sắp xếp theo t tăng dần:
mysql> SELECT Id, DueDate,
-> DATEDIFF(DueDate, CURDATE()) AS t
-> FROM DemoTable
-> ORDER BY CASE WHEN t < 0 THEN 1 ELSE 0 END, t;
Kết quả
+----+---------------------+------+ | Id | DueDate | t | +----+---------------------+------+ | 4 | 2019-06-10 00:00:00 | 1 | | 5 | 2019-06-11 00:00:00 | 2 | | 1 | 2019-06-12 00:00:00 | 3 | | 2 | 2019-06-01 00:00:00 | -8 | | 3 | 2019-06-05 00:00:00 | -4 | +----+---------------------+------+
Giải thích: CASE WHEN t<0 THEN 1 ELSE 0 END gán nhóm 0 cho ngày tương lai, 1 cho ngày quá khứ. Sắp xếp nhóm 0 trước, sau đó theo t tăng dần.