PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Sắp xếp dấu thời gian (bao gồm cả tương lai) theo khoảng cách tuyệt đối từ bây giờ

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 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 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").



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mối quan hệ không tồn tại

  2. Định dạng chuỗi psycopg2 với các tên biến để tạo kiểu

  3. Xóa các hàng trùng lặp (không xóa tất cả các hàng trùng lặp)

  4. tạo cột cho ngày tự động trong postgresql

  5. Postgres chỉ mục nhiều cột duy nhất cho bảng tham gia