sql >> Databáze >  >> RDS >> PostgreSQL

Seřaďte časová razítka (včetně budoucích) podle absolutní vzdálenosti od nynějška

Použijte now() nebo CURRENT_TIMESTAMP za tímto účelem.

Důvod pro různé výsledky vašich dotazů je tento:

Když odečtete dvě hodnoty typu date , výsledkem je integer a abs() je použitelné.
Když odečtete dvě hodnoty typu timestamp (nebo jen jeden je timestamp ), výsledkem je interval a abs() není použitelné. Můžete nahradit CASE výraz:

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

Nebo můžete extract() unixová epoch z výsledného interval jako již předvedl @Craig. Cituji:"u intervalových hodnot celkový počet sekund v intervalu". Pak můžete použít abs() znovu:

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

age() by jen přidalo lidsky čitelnější reprezentaci intervalu sečtením dnů do měsíců a let pro větší intervaly. Ale to je vedle:hodnota se používá pouze pro řazení.

Protože je váš sloupec typu časové razítko, měli byste použít CURRENT_TIMESTAMP (nebo now() ) namísto CURRENT_DATE nebo získáte nepřesné výsledky (nebo dokonce nesprávné pro „dnes“).



  1. Vynucené generování kódu typu JOOQ

  2. převod obrázku v paměti na blob

  3. Volání uložené procedury s parametrem Out pomocí PDO

  4. spuštění serveru PostgreSQL root není povoleno