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