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