sql >> Database >  >> RDS >> PostgreSQL

Sorteer tijdstempels (inclusief toekomst) op absolute afstand vanaf nu

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



  1. Gematerialiseerde weergave snel vernieuwen met HAVING-clausule?

  2. Postgresql Huidige tijdstempel op Update

  3. Maak een opmerkingenveld in PHP en MySql voor elke ID

  4. Kun jij deze eenvoudige SQL-query oplossen?