Използвайте 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 , или ще получите неточни резултати (или дори неправилни за „днес“).