Bagaimana cara membandingkan tanggal cap waktu dengan parameter khusus tanggal di MySQL?

91

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

Michael
sumber

Jawaban:

149

Anda dapat menggunakan DATE()fungsi untuk mengekstrak bagian tanggal stempel waktu:

SELECT * FROM table
WHERE DATE(timestamp) = '2012-05-25'

Padahal, jika Anda memiliki indeks di kolom stempel waktu, ini akan lebih cepat karena dapat menggunakan indeks di kolom stempel waktu jika Anda memilikinya:

SELECT * FROM table
WHERE timestamp BETWEEN '2012-05-25 00:00:00' AND '2012-05-25 23:59:59'
Marcus Adams
sumber
6
Melalui tes kecil yang baru saja saya jalankan, saya menemukan penggunaan BETWEEN lebih cepat dengan faktor 10X Hanya FYI
DarbyM
1
Gunakan tanggal yang jelas angkanya berarti jenisnya.
Lukas Salich
8
 WHERE cast(timestamp as date) = '2012-05-05'
juergen d
sumber
7

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 BETWEENhanya 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 antara 2012-05-05 23:59:59.001dan 2012-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'
Tom Kitson
sumber
5
SELECT * FROM table WHERE timestamp >= '2012-05-05 00:00:00' 
    AND timestamp <= '2012-05-05 23:59:59'
Cfreak
sumber
2

Gunakan fungsi konversi MYSQL:

SELECT * FROM table WHERE DATE(timestamp) = '2012-05-05' 

Ini seharusnya berhasil

adrien
sumber
1

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.

asnyder
sumber
0

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')
devesh
sumber
0

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');
Pembuat kunci00
sumber
0

Menggunakan

SELECT * FROM table WHERE DATE(2012-05-05 00:00:00) = '2012-05-05' 
Muhammad Fahad
sumber