PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Sortuj znaczniki czasu (w tym przyszłość) według bezwzględnej odległości od teraz

Użyj now() lub CURRENT_TIMESTAMP w tym celu.

Powodem różnych wyników zapytań jest to:

Po odjęciu dwóch wartości typu date , wynikiem jest integer i abs() ma zastosowanie.
Po odjęciu dwóch wartości typu timestamp (lub tylko jeden to timestamp ), wynikiem jest interval i abs() nie ma zastosowania. Możesz zastąpić CASE wyrażenie:

ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END

Możesz też extract() unixowa epoch z wynikowego interval jak już zademonstrował @Craig. Cytuję:„dla wartości interwału całkowita liczba sekund w interwale”. Następnie możesz użyć abs() ponownie:

ORDER BY abs(extract(epoch from (expiry - now())));

age() dodałby po prostu bardziej czytelną dla człowieka reprezentację do interwału, sumując dni na miesiące i lata dla większych interwałów. Ale to nie ma znaczenia:wartość jest używana tylko do sortowania.

Ponieważ Twoja kolumna jest typu datownik, powinieneś użyć CURRENT_TIMESTAMP (lub now() ) zamiast CURRENT_DATE , lub otrzymasz niedokładne wyniki (lub nawet nieprawidłowe dla „dzisiaj”).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. postgres wykrywa powtarzające się wzorce zer

  2. BŁĄD:nie można załadować biblioteki „/opt/PostgreSQL/9.0/lib/postgresql/plperl.so”:libperl.so:

  3. Grupuj powiązane rekordy, ale wybierz określone pola tylko z pierwszego rekordu

  4. Uzyskaj minimalną niezerową wartość w wielu kolumnach

  5. Pokazywanie miesięcznych sum z wielu kolumn w PostgreSQL