PostgreSQL
 sql >> Teknologi Basis Data >  >> RDS >> PostgreSQL

Urutkan stempel waktu (termasuk masa depan) berdasarkan jarak absolut dari sekarang

Gunakan now() atau CURRENT_TIMESTAMP untuk tujuan tersebut.

Alasan untuk hasil kueri Anda yang berbeda adalah ini:

Saat Anda mengurangi dua nilai dari jenis date , hasilnya adalah integer dan abs() berlaku.
Bila Anda mengurangi dua nilai dari jenis timestamp (atau hanya satu yang merupakan timestamp ), hasilnya adalah interval , dan abs() tidak berlaku. Anda bisa menggantinya dengan CASE ekspresi:

ORDER BY CASE WHEN expiry > now() THEN expiry - now() ELSE now() - expiry END

Atau Anda dapat extract() unix epoch dari interval yang dihasilkan seperti @Craig sudah didemonstrasikan. Saya kutip:"untuk nilai interval, jumlah detik dalam interval". Kemudian Anda dapat menggunakan abs() lagi:

ORDER BY abs(extract(epoch from (expiry - now())));

age() hanya akan menambahkan representasi yang lebih dapat dibaca manusia ke interval dengan menjumlahkan hari menjadi bulan dan tahun untuk interval yang lebih besar. Tapi bukan itu intinya:nilainya hanya digunakan untuk menyortir.

Karena kolom Anda bertipe timestamp, Anda harus menggunakan CURRENT_TIMESTAMP (atau now() ) bukannya CURRENT_DATE , atau Anda akan mendapatkan hasil yang tidak akurat (atau bahkan salah untuk "hari ini").



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Perpustakaan Aritmatika Terenkripsi Sederhana (SEAL) dan segel::variabel ciphertext

  2. Bagaimana cara menggunakan `RETURN NEXT` di PL/pgSQL dengan benar?

  3. Masalah Jpa ManytoMany dengan Spring Boot

  4. Bergabunglah dengan dua tabel menggunakan id dan turunan dari tabel seperti pohon

  5. Menambahkan tabel pengguna/akun ke Postgres di Django View