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