Saya telah menghadapi skenario aneh ketika membandingkan antara tanggal di postgresql (versi 9.2.4 di windows). Saya memiliki kolom di tabel saya mengatakan update_date dengan ketik 'timestamp tanpa zona waktu'. Klien dapat mencari bidang ini dengan hanya tanggal (yaitu: 2013-05-03) atau tanggal dengan waktu (yaitu: 2013-05-03 12:20:00). Kolom ini memiliki nilai sebagai cap waktu untuk semua baris saat ini dan memiliki bagian tanggal yang sama (2013-05-03) tetapi perbedaan dalam bagian waktu.
Ketika saya membandingkan kolom ini, saya mendapatkan hasil yang berbeda. Seperti berikut ini:
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date < '2013-05-03' -> No results
select * from table where update_date >= '2013-05-03' AND update_date <= '2013-05-04' -> results found
select * from table where update_date >= '2013-05-03' -> results found
Pertanyaan saya adalah bagaimana saya bisa membuat kueri pertama mungkin untuk mendapatkan hasil, maksud saya mengapa kueri ke-3 berfungsi tetapi bukan yang pertama?
Adakah yang bisa membantu saya dengan ini? Terima kasih sebelumnya.
sumber
'2013-05-03'::date
dan'1 day'::interval
) PostgreSQL spesifik?CAST('2013-05-03' AS DATE) + CAST('1 day' AS INTERVAL)
(IIRC). YMMV tentang keberadaan dan perilakuDATE
danINTERVAL
.::DATE
ditambahkan ke bagian pertama klausa whereWHERE update_date::date = '2013-05-03'
bekerja dengan baik dan mungkin sedikit lebih mudah dibaca?update_date
adalahtimestamp without timezone
. saya mengasumsikan indeks pada kolom itu. predikat Anda tidak akan menggunakan indeks itu.Ketika Anda membandingkan
update_date >= '2013-05-03'
postgres, melemparkan nilai ke tipe yang sama untuk membandingkan nilai. Jadi '2013-05-03' Anda dimasukkan ke '2013-05-03 00:00:00'.Jadi untuk update_date = '2013-05-03 14:45:00' ekspresi Anda adalah:
Ini selalu
false
Untuk mengatasi masalah ini, berikan pembaruan_date ke
date
:sumber
update_date
dalam tabel vs casting nilai tunggal dari parameter kueri sangat tidak efisien, dan memastikan server tidak akan dapat meningkatkan indeks pada kolom itu. Saya tergoda untuk -1 ini.SELECT * FROM my_table WHERE update_date >= '2013-05-03' AND update_date < '2013-05-04';
(Perhatikan penggunaan 4 Mei daripada ke-3 dan dengan KURANG-KETIGA DARI TANDA daripada kurang-atau-sama.)Gunakan
range
tipenya. Jika pengguna memasukkan tanggal:Jika pengguna memasukkan cap waktu maka Anda tidak perlu
::date + 1
bagian ituhttp://www.postgresql.org/docs/9.2/static/rangetypes.html
http://www.postgresql.org/docs/9.2/static/functions-range.html
sumber
Gunakan Konversi tanggal untuk membandingkan dengan tanggal: Coba Ini:
sumber