Brug now() eller CURRENT_TIMESTAMP til formålet.
Årsagen til det forskellige udfald af dine forespørgsler er denne:
Når du trækker to værdier af typen date fra , resultatet er et integer og abs() er gældende.
Når du trækker to værdier fra typen timestamp (eller bare én er et timestamp ), er resultatet et interval , og abs() er ikke gældende. Du kan erstatte med en CASE udtryk:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Eller du kan extract()
unix epoch fra det resulterende interval ligesom @Craig allerede har demonstreret. Jeg citerer:"for intervalværdier, det samlede antal sekunder i intervallet". Så kan du bruge abs() igen:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
ville blot tilføje en mere menneskelig læsbar repræsentation til intervallet ved at opsummere dage i måneder og år for større intervaller. Men det er ved siden af pointen:værdien bruges kun til sortering.
Da din kolonne er af typen tidsstempel, bør du bruge CURRENT_TIMESTAMP (eller now() ) i stedet for CURRENT_DATE , ellers vil du få unøjagtige resultater (eller endda forkerte for "i dag").