Saya memiliki kolom tipe "datetime" dengan nilai-nilai seperti 2009-10-20 10:00:00
Saya ingin mengekstrak tanggal dari datetime dan menulis kueri seperti:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
Apakah mengikuti cara terbaik untuk melakukannya?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
Namun ini mengembalikan resultset kosong. Ada saran?
Penggunaan
WHERE DATE(datetime) = '2009-10-20'
memiliki masalah kinerja . Seperti yang dinyatakan di sini :DATE()
untuk semua baris, termasuk yang tidak cocok.Gunakan
BETWEEN
atau>
,<
,=
operator yang memungkinkan untuk menggunakan indeks:Update: yang berdampak pada menggunakan
LIKE
bukannya operator di kolom diindeks tinggi . Ini adalah beberapa hasil tes di atas meja dengan 1.176.000 baris:datetime LIKE '2009-10-20%'
=> 2931 msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168msKetika melakukan panggilan kedua melalui permintaan yang sama, perbedaannya bahkan lebih tinggi: 2984 ms vs 7 ms (ya, hanya 7 milidetik!). Saya menemukan ini ketika menulis ulang beberapa kode lama pada suatu proyek menggunakan Hibernate.
sumber
DATE(datetime)
untukBETWEEN AND
menjalankan adegan, kami mendapatkan pernyataan pendek dan performa keren. Kenapa tidak? Kenapa mereka tidak melakukan ini? :)DATE(datetime) in (:list)
tidak bekerja denganBETWEEN
Anda dapat memformat datetime ke bagian YMD:
sumber
DATE_FORMAT(datetime, '%H:%i:%S')
Meskipun semua jawaban pada halaman akan mengembalikan hasil yang diinginkan, mereka semua memiliki masalah kinerja. Jangan pernah melakukan perhitungan pada bidang dalam
WHERE
klausa (termasukDATE()
perhitungan) karena perhitungan itu harus dilakukan pada semua baris dalam tabel.The
BETWEEN ... AND
membangun inklusif untuk kedua kondisi perbatasan, membutuhkan satu untuk menentukan 23:59:59 sintaks pada tanggal akhir yang sendiri memiliki masalah lain (transaksi mikrodetik, yang saya percaya MySQL tidak mendukung pada 2009 ketika pertanyaan diajukan).Cara yang tepat untuk menanyakan
timestamp
bidang MySQL untuk hari tertentu adalah dengan memeriksa Greater-Than-Equals terhadap tanggal yang diinginkan, dan Less-Than untuk hari berikutnya, tanpa jam yang ditentukan.Ini adalah yang berkinerja tercepat, memori terendah, metode intensif sumber daya terendah, dan juga mendukung semua fitur MySQL dan kasing-kasus seperti ketepatan cap waktu sub-detik. Selain itu, ini adalah bukti masa depan.
sumber
Ini semua format
Katakan ini adalah kolom yang berisi
datetime
nilai, tabeldata
.sumber
Kamu bisa memakai:
Atau:
Atau:
sumber
cara sederhana dan terbaik untuk menggunakan fungsi tanggal
contoh
ATAU
sumber
Nah, menggunakan
LIKE
dalam pernyataan adalah pilihan terbaikWHERE datetime LIKE '2009-10-20%'
yang seharusnya berfungsi dalam kasus inisumber