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