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