Dalam pernyataan SQL, bagaimana cara membandingkan tanggal yang disimpan sebagai TIMESTAMP dengan tanggal dalam format YYYY-MM-DD?
Ex.: SELECT * FROM table WHERE timestamp = '2012-05-25'
Saya ingin kueri ini mengembalikan semua baris yang memiliki stempel waktu pada hari yang ditentukan, tetapi hanya mengembalikan baris yang memiliki stempel waktu tengah malam.
Terima kasih
sumber
Seperti yang disarankan oleh beberapa orang, dengan menggunakan
DATE(timestamp)
Anda menerapkan manipulasi ke kolom dan oleh karena itu Anda tidak dapat mengandalkan pengurutan indeks.Namun, penggunaan
BETWEEN
hanya dapat diandalkan jika Anda memasukkan milidetik. Dalam contoh stempel waktu,BETWEEN '2012-05-05 00:00:00' AND '2012-05-05 23:59:59'
Anda mengecualikan rekaman dengan stempel waktu antara2012-05-05 23:59:59.001
dan2012-05-05 23:59:59.999
. Namun, bahkan metode ini memiliki beberapa masalah, karena ketepatan tipe datanya. Terkadang 999 milidetik dibulatkan.Hal terbaik untuk dilakukan adalah:
SELECT * FROM table WHERE date>='2012-05-05' AND date<'2012-05-06'
sumber
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' AND timestamp <= '2012-05-05 23:59:59'
sumber
Gunakan fungsi konversi MYSQL:
SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05'
Ini seharusnya berhasil
sumber
Saat saya meneliti ini, saya pikir akan menyenangkan untuk memodifikasi solusi ANTARA untuk menunjukkan contoh untuk tanggal non-statis / string tertentu, melainkan tanggal variabel, atau hari ini seperti
CURRENT_DATE()
. Ini AKAN menggunakan indeks pada kolom log_timestamp.SELECT * FROM some_table WHERE log_timestamp BETWEEN timestamp(CURRENT_DATE()) AND # Adds 23.9999999 HRS of seconds to the current date timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL '86399.999999' SECOND_MICROSECOND));
Saya melakukan detik / mikrodetik untuk menghindari kasus 12AM pada hari berikutnya. Namun, Anda juga dapat melakukan `` INTERVAL '1 HARI' melalui operator perbandingan untuk pendekatan non-ANTARA yang lebih ramah-pembaca:
SELECT * FROM some_table WHERE log_timestamp >= timestamp(CURRENT_DATE()) AND log_timestamp < timestamp(DATE_ADD(CURRENT_DATE(), INTERVAL 1 DAY));
Kedua pendekatan ini akan menggunakan indeks dan akan melakukan JAUH lebih cepat. Keduanya tampak sama cepatnya.
sumber
Jika Anda menggunakan parameter SQL untuk menjalankan kueri maka ini akan membantu
SELECT * FROM table WHERE timestamp between concat(date(?), ' ', '00:00:00') and concat(date(?), ' ', '23:59:59')
sumber
Ketika saya membaca pertanyaan Anda, saya pikir Anda ada di Oracle DB sampai saya melihat tag 'MySQL'. Bagaimanapun, untuk orang yang bekerja dengan Oracle, inilah caranya:
SELECT * FROM table where timestamp = to_timestamp('21.08.2017 09:31:57', 'dd-mm-yyyy hh24:mi:ss');
sumber
Menggunakan
SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05'
sumber