Използвайте now() или CURRENT_TIMESTAMP за целта.
Причината за различния резултат от вашите запитвания е следната:
Когато извадите две стойности от тип date
, резултатът е integer
и abs()
е приложимо.
Когато извадите две стойности от тип timestamp
(или само един е timestamp
), резултатът е interval
и abs()
не е приложимо. Можете да замените с CASE
израз:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Или можете extract()
epoch
на unix от получения interval
като @Craig вече демонстрира. Цитирам:"за интервални стойности, общият брой секунди в интервала". След това можете да използвате abs()
отново:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
просто ще добави по-разбираемо за хората представяне към интервала чрез сумиране на дните в месеци и години за по-големи интервали. Но това не е важно:стойността се използва само за сортиране.
Тъй като вашата колона е от тип timestamp, трябва да използвате CURRENT_TIMESTAMP
(или now()
) вместо CURRENT_DATE
, или ще получите неточни резултати (или дори неправилни за „днес“).