Użyj now() lub CURRENT_TIMESTAMP w tym celu.
Powodem różnych wyników zapytań jest to:
Po odjęciu dwóch wartości typu date , wynikiem jest integer i abs() ma zastosowanie.
Po odjęciu dwóch wartości typu timestamp (lub tylko jeden to timestamp ), wynikiem jest interval i abs() nie ma zastosowania. Możesz zastąpić CASE wyrażenie:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Możesz też extract()
unixowa epoch z wynikowego interval jak już zademonstrował @Craig. Cytuję:„dla wartości interwału całkowita liczba sekund w interwale”. Następnie możesz użyć abs() ponownie:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
dodałby po prostu bardziej czytelną dla człowieka reprezentację do interwału, sumując dni na miesiące i lata dla większych interwałów. Ale to nie ma znaczenia:wartość jest używana tylko do sortowania.
Ponieważ Twoja kolumna jest typu datownik, powinieneś użyć CURRENT_TIMESTAMP (lub now() ) zamiast CURRENT_DATE , lub otrzymasz niedokładne wyniki (lub nawet nieprawidłowe dla „dzisiaj”).