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

Sắp xếp TIMESTAMP giảm dần nhưng đặt '0000-00-00 00:00:00' lên đầu trong MySQL


Vấn đề

Cột TIMESTAMP có giá trị '0000-00-00 00:00:00' (zero date). Muốn sắp xếp DESC nhưng đặt zero date lên đầu.

Giải pháp: ORDER BY biểu thức boolean

ORDER BY (`timestamp` = 0) DESC, `timestamp` DESC

Ví dụ minh họa

Tạo bảng và chèn dữ liệu

mysql> CREATE TABLE DemoTable (
    `timestamp` TIMESTAMP
);
mysql> INSERT INTO DemoTable VALUES 
(NOW()), ('00:00:00'), ('2018-01-10 12:34:45'), ('2019-12-31 10:50:45');

Xem dữ liệu (zero date hiển thị 0000-00-00 00:00:00)

mysql> SELECT * FROM DemoTable;
+---------------------+
| timestamp           |
+---------------------+
| 2019-08-17 06:17:12 |
| 0000-00-00 00:00:00 |
| 2018-01-10 12:34:45 |
| 2019-12-31 10:50:45 |
+---------------------+

Truy vấn sắp xếp đặc biệt

mysql> SELECT * FROM DemoTable 
ORDER BY (`timestamp` = 0) DESC, `timestamp` DESC;

Kết quả

+---------------------+
| timestamp           |
+---------------------+
| 0000-00-00 00:00:00 |  -- Zero date lên đầu (TRUE=1)
| 2019-12-31 10:50:45 |  -- Sau đó DESC bình thường
| 2019-08-17 06:17:12 |
| 2018-01-10 12:34:45 |
+---------------------+

Giải thích

  • `timestamp` = 0: Biểu thức boolean, TRUE (1) cho zero date, FALSE (0) cho ngày khác.
  • DESC: TRUE (1) > FALSE (0) → Zero date lên đầu.
  • `timestamp` DESC: Sắp xếp thứ 2 cho các ngày không phải zero.

Mở rộng: Đặt NULL lên đầu/cuối

-- NULL lên đầu
ORDER BY (col IS NULL) DESC, col DESC

-- NULL xuống cuối
ORDER BY (col IS NULL) ASC, col DESC

Lưu ý

  • Zero date '0000-00-00' là giá trị đặc biệt của MySQL (không phải NULL).
  • SQL mode NO_ZERO_DATE cấm insert zero date.
  • Cách này áp dụng cho mọi kiểu dữ liệu so sánh được (DATE, DATETIME, INT...).