sql >> Databasteknik >  >> RDS >> PostgreSQL

Sortera tidsstämplar (inklusive framtid) efter absolut avstånd från och med nu

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



  1. Hur man hårdkodar where-villkoret i listvyn, grundläggande sökning, förhandssökning i sugar CE

  2. MYSQLI förberedd uttalande ger ingen utmatning

  3. Hur ringer man en orakelprocedur på Laravel?

  4. Skicka PHP-variabel till bootstrap modal