PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Ordina i timestamp (incluso il futuro) in base alla distanza assoluta da ora

Usa now() o CURRENT_TIMESTAMP allo scopo.

Il motivo del diverso esito delle tue domande è questo:

Quando sottrai due valori di tipo date , il risultato è un integer e abs() è applicabile.
Quando sottrai due valori di tipo timestamp (o solo uno è un timestamp ), il risultato è un interval e abs() non è applicabile. Potresti sostituirlo con un CASE espressione:

ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END

Oppure puoi extract() l'epoch unix dall'interval risultante come @Craig ha già dimostrato. Cito:"per i valori di intervallo, il numero totale di secondi nell'intervallo". Quindi puoi usare abs() ancora:

ORDER BY abs(extract(epoch from (expiry - now())));

age() aggiungerebbe solo una rappresentazione più leggibile dall'uomo all'intervallo sommando i giorni in mesi e anni per intervalli più grandi. Ma non è questo il punto:il valore viene utilizzato solo per l'ordinamento.

Poiché la tua colonna è di tipo timestamp, dovresti utilizzare CURRENT_TIMESTAMP (o now() ) invece di CURRENT_DATE o otterrai risultati imprecisi (o addirittura errati per "oggi").