Använd now() eller CURRENT_TIMESTAMP för ändamålet.
Anledningen till det olika resultatet av dina frågor är detta:
När du subtraherar två värden av typen date
, resultatet är ett integer
och abs()
är tillämpligt.
När du subtraherar två värden av typen timestamp
(eller bara en är en timestamp
), blir resultatet ett interval
och abs()
är inte tillämplig. Du kan ersätta med en CASE
uttryck:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Eller så kan du extract()
unix epoch
från det resulterande interval
som @Craig redan demonstrerat. Jag citerar:"för intervallvärden, det totala antalet sekunder i intervallet". Sedan kan du använda abs()
igen:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
skulle bara lägga till en mer mänsklig läsbar representation till intervallet genom att summera dagar till månader och år för större intervall. Men det är vid sidan om:värdet används bara för sortering.
Eftersom din kolumn är av typen tidsstämpel bör du använda CURRENT_TIMESTAMP
(eller now()
) istället för CURRENT_DATE
, eller så får du felaktiga resultat (eller till och med felaktiga för "idag").