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