sql >> Base de Datos >  >> RDS >> PostgreSQL

Ordene las marcas de tiempo (incluido el futuro) por distancia absoluta desde ahora

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