Utilice ahora() o CURRENT_TIMESTAMP para el propósito.
El motivo del resultado diferente de sus consultas es el siguiente:
Cuando restas dos valores de tipo date , el resultado es un integer y abs() es aplicable.
Cuando resta dos valores de tipo timestamp (o solo uno es un timestamp ), el resultado es un interval y abs() no es aplicable. Podrías sustituirlo por un CASE expresión:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
O puede extract()
la epoch de Unix del interval resultante como @Craig ya demostró. Cito:"para valores de intervalo, el número total de segundos en el intervalo". Entonces puedes usar abs() de nuevo:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
simplemente agregaría una representación más legible por humanos al intervalo al resumir los días en meses y años para intervalos más grandes. Pero eso no viene al caso:el valor solo se usa para ordenar.
Como su columna es de tipo marca de tiempo, debe usar CURRENT_TIMESTAMP (o now() ) en lugar de CURRENT_DATE , o obtendrá resultados inexactos (o incluso incorrectos para "hoy").