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