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