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

Sắp xếp và hiển thị khoảng cách ngày so với ngày hiện tại trong MySQL

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.