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_DATEcấ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...).