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