Gebruik now() of CURRENT_TIMESTAMP voor het doel.
De reden voor de verschillende uitkomst van uw zoekopdrachten is deze:
Wanneer u twee waarden van het type date aftrekt , het resultaat is een integer en abs() is van toepassing.
Als u twee waarden van het type timestamp aftrekt (of slechts één is een timestamp ), is het resultaat een interval , en abs() is niet van toepassing. Je zou kunnen vervangen door een CASE uitdrukking:
ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END
Of je kunt extract()
het unix epoch van het resulterende interval zoals @Craig al heeft aangetoond. Ik citeer:"voor intervalwaarden, het totale aantal seconden in het interval". Dan kun je abs() . gebruiken nogmaals:
ORDER BY abs(extract(epoch from (expiry - now())));
age()
zou gewoon een meer voor mensen leesbare weergave aan het interval toevoegen door dagen op te tellen in maanden en jaren voor grotere intervallen. Maar dat terzijde:de waarde wordt alleen gebruikt om te sorteren.
Aangezien uw kolom van het type tijdstempel is, moet u CURRENT_TIMESTAMP . gebruiken (of now() ) in plaats van CURRENT_DATE , of je krijgt onnauwkeurige resultaten (of zelfs incorrect voor "vandaag").