PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Classificar carimbos de data/hora (incluindo futuros) por distância absoluta a partir de agora


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