Saya mencoba memilih hanya catatan hari ini dari tabel database.
Saat ini saya gunakan
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Tetapi ini membutuhkan hasil selama 24 jam terakhir, dan saya memerlukannya untuk hanya memilih hasil mulai hari ini, mengabaikan waktu. Bagaimana saya dapat memilih hasil berdasarkan tanggal saja?
Using where; Using index
?timestamp
(dandate
seperti dalam kasus saya) adalah kata yang dipesan MySQLJika Anda ingin indeks digunakan dan kueri tidak melakukan pemindaian tabel:
Untuk menunjukkan perbedaan yang dibuat pada rencana eksekusi sebenarnya, kami akan menguji dengan SQL-Fiddle (situs yang sangat membantu):
Ayo coba 2 versi sekarang.
Versi 1 dengan
DATE(timestamp) = ?
Menjelaskan:
Ini memfilter semua (6671) baris dan kemudian melakukan filesort (itu bukan masalah karena baris yang dikembalikan sedikit)
Versi 2 dengan
timestamp <= ? AND timestamp < ?
Menjelaskan:
Ini menggunakan pemindaian rentang pada indeks , dan kemudian hanya membaca baris yang sesuai dari tabel.
sumber
INDEX t_IX (timestamp, id)
bisa (seharusnya?) begitu sajaINDEX t_IX (timestamp)
, karena kunci utama tersirat dalam indeks. atau adakah alasan saya tidak mengerti untuk melakukan itu? saya mencobanya di sql-fiddle dan melihat rencana eksekusi yang sama (lebih baik)id
(karena ini adalah PK dan dengan demikian indeks berkerumun dari tabel) tetap ditambahkan dalam indeks. Jadi, tidak ada salahnya untuk menambahkannya secara eksplisit (dan ini mungkin menangkap beberapa titik buta pengoptimal). Ini tentu tidak relevan dalam kasus / kueri ini.timestamp < CURDATE() + INTERVAL 1 DAY
perlu?lebih pendek, tidak perlu menggunakan 'AND timestamp <CURDATE () + INTERVAL 1 DAY'
karena CURDATE () selalu mengembalikan hari ini
Fungsi MySQL CURDATE ()
sumber
Berapa cara kita menguliti kucing ini? Inilah varian lainnya.
PILIH * DARI
table
MANA TANGGAL (FROM_UNIXTIME (timestamp
)) = '2015-11-18';sumber
Jika Anda ingin membandingkan dengan tanggal tertentu, Anda bisa langsung menulisnya seperti:
// disini timestamp adalah nama kolom yang bertipe timestamp
atau
Untuk mengambil tanggal hari ini, tersedia fungsi CURDATE (), jadi:
sumber
Cukup kirimkan ke tanggal:
sumber
Ini bisa jadi yang paling mudah menurut saya:
sumber
Atau Anda bisa menggunakan alternatif CURRENT_DATE, dengan hasil yang sama:
Contoh dari database.guide
sumber
Pada Visual Studio 2017, menggunakan database built-in untuk pengembangan, saya memiliki masalah dengan solusi yang diberikan saat ini, saya harus mengubah kode untuk membuatnya berfungsi karena melemparkan kesalahan bahwa DATE () bukan fungsi built-in.
Inilah solusi saya:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
sumber