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