PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Сортирайте клеймата за време (включително бъдеще) по абсолютно разстояние от сега

Използвайте now() или CURRENT_TIMESTAMP за целта.

Причината за различния резултат от вашите запитвания е следната:

Когато извадите две стойности от тип date , резултатът е integer и abs() е приложимо.
Когато извадите две стойности от тип timestamp (или само един е timestamp ), резултатът е interval и abs() не е приложимо. Можете да замените с CASE израз:

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

Или можете extract() epoch на unix от получения interval като @Craig вече демонстрира. Цитирам:"за интервални стойности, общият брой секунди в интервала". След това можете да използвате abs() отново:

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

age() просто ще добави по-разбираемо за хората представяне към интервала чрез сумиране на дните в месеци и години за по-големи интервали. Но това не е важно:стойността се използва само за сортиране.

Тъй като вашата колона е от тип timestamp, трябва да използвате CURRENT_TIMESTAMP (или now() ) вместо CURRENT_DATE , или ще получите неточни резултати (или дори неправилни за „днес“).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Изпълнявам n бр. на процеси, където n е може да бъде между 5 - 50. Всеки процес извършва множество dml операции на postgres

  2. Как да изберете двоични данни от колона postgres

  3. Актуализирайте множество редове в таблица от друга таблица, когато съществува условие

  4. PostgreSQL компресирани архивни регистрационни файлове в Windows

  5. Вземете данни от php в c# скрипт