sql >> Database teknologi >  >> RDS >> PostgreSQL

Sorter tidsstempler (inklusive fremtid) efter absolut afstand fra nu

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



  1. Datotype uden tid i Oracle

  2. Sådan opretter du med vilje en langvarig MySQL-forespørgsel

  3. Mac OS X + Python + Django + MySQL

  4. Træk antal dage fra en dato i PL/SQL