Use now() ou CURRENT_TIMESTAMP para o propósito.
A razão para o resultado diferente de suas consultas é esta:
Ao subtrair dois valores do tipo
date
, o resultado é um integer
e abs()
é aplicável.Quando você subtrai dois valores do tipo
timestamp
(ou apenas um é um timestamp
), o resultado é um interval
e abs()
não é aplicável. Você pode substituir por um CASE
expressão:ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Ou você pode
extract()
o unix epoch
do interval
resultante como @Craig já demonstrou. Cito:"para valores de intervalo, o número total de segundos no intervalo". Então você pode usar abs()
novamente:ORDER BY abs(extract(epoch from (expiry - now())));
age()
apenas adicionaria uma representação mais legível ao intervalo, somando dias em meses e anos para intervalos maiores. Mas isso não vem ao caso:o valor é usado apenas para ordenação. Como sua coluna é do tipo timestamp, você deve usar
CURRENT_TIMESTAMP
(ou now()
) em vez de CURRENT_DATE
, ou você obterá resultados imprecisos (ou mesmo incorretos para "hoje").