Sử dụng now () hoặc CURRENT_TIMESTAMP cho mục đích.
Lý do cho kết quả khác nhau của các truy vấn của bạn là:
Khi bạn trừ hai giá trị của loại date
, kết quả là một integer
và abs()
có thể áp dụng.
Khi bạn trừ hai giá trị của loại timestamp
(hoặc chỉ một là timestamp
), kết quả là một interval
và abs()
không áp dụng. Bạn có thể thay thế bằng CASE
biểu thức:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Hoặc bạn có thể extract()
the unix epoch
từ khoảng interval
kết quả như @Craig đã được chứng minh. Tôi trích dẫn:"cho các giá trị khoảng thời gian, tổng số giây trong khoảng thời gian". Sau đó, bạn có thể sử dụng abs()
một lần nữa:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
sẽ chỉ thêm một biểu diễn dễ đọc hơn của con người vào khoảng thời gian bằng cách cộng các ngày thành tháng và năm cho các khoảng thời gian lớn hơn. Nhưng điều đó không quan trọng ở điểm:giá trị chỉ được sử dụng để sắp xếp.
Vì cột của bạn thuộc loại dấu thời gian, bạn nên sử dụng CURRENT_TIMESTAMP
(hoặc now()
) thay vì CURRENT_DATE
hoặc bạn sẽ nhận được kết quả không chính xác (hoặc thậm chí không chính xác cho "hôm nay").