MySQL Pilih Tanggal Sama dengan Hari Ini

97

Saya mencoba menjalankan pernyataan pilih mysql yang terlihat pada tanggal hari ini dan hanya mengembalikan hasil yang terdaftar pada hari ini. Saat ini saya mencoba yang berikut ini, tetapi sepertinya tidak berhasil.

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE users.signup_date = CURDATE()

Saya telah mengubah SELECTpernyataan saya menjadi ini, terima kasih teman-teman.

SELECT id FROM users WHERE DATE(signup_date) = CURDATE()

Jako
sumber
tampaknya itu signup_dateadalah bidang waktu
Sergii Stotskyi
@Serjio Ya, saat ini bidang itu adalah bidang waktu waktu.
Jako
apa tipe data signup_datejika berisi waktu, maka Anda akan ingin menggunakan date_format dalam WHEREklausa untuk menghapus waktu agar cocok denganCURDATE()
Taryn
@bluefeet terima kasih, saya telah mengubah skrip saya. Tampaknya berhasil, tetapi ketika tidak ada hasil. mysql_num_rowstidak menampilkan 0. Hanya kosong.
Jako

Jawaban:

199
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
sumber
apakah perlu menggunakan DATE () meskipun field adalah tipe Date?
rashidnk
2
@rashidnk Tidak. Meskipun dia tidak mengatakan dengan jelas dalam pertanyaan tersebut, bidang tersebut tampaknya bertipe DATETIME.
Barmar
2
Meskipun solusi ini benar-benar benar, ia tidak berskala dengan baik (tidak dapat menggunakan indeks signup_date, meskipun indeks seperti itu ada). Lebih suka solusi Serjio .
RandomSeed
atau jika menemukan pada tanggal tertentu, dengan indeks juga digunakan `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM users where signup_date> = '2017-08 -30 00:00:00 'dan signup_date <=' 2017-08-30 23:59:59 '; ``
Sumit M Asok
3
@SumitMAsok Lebih baik digunakan < '2017-08-31 00:00:00'jika Anda menggunakan versi MySQL dengan milidetik.
Barmar
29

Kueri ini akan menggunakan indeks jika Anda memilikinya untuk signup_datebidang

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)
Sergii Stotskyi
sumber
Suara negatif untuk jawaban ini tidak masuk akal. Ini sebenarnya adalah pendekatan yang lebih disukai, karena kueri ini akan dapat memanfaatkan indeks signup_date, tidak seperti pendekatan lain.
RandomSeed
2
@RandomSeed Ide umum pengujian signup_dateantara dua waktu adalah benar, tetapi waktunya tidak. Ini harus antara 00:00dan 23:59:59pada tanggal sekarang.
Barmar
Yah, interval tanggalnya juga salah>. <Suara negatifnya ternyata tidak terlalu absurd.
RandomSeed
Kueri ini jauh lebih berkinerja (karena indeks). The WHERE DATE(signup_date) = CURDATE()mengambil server saya ~ 50 ms, ini satu di sini 0,8 ms.
Kai Noack
13

Sepertinya Anda perlu menambahkan pemformatan ke WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE_FORMAT(users.signup_date, '%Y-%m-%d') = CURDATE()

Lihat SQL Fiddle dengan Demo

Taryn
sumber
1

Anda dapat menggunakan CONCATdengan CURDATE()sepanjang hari dan kemudian memfilter dengan menggunakan kondisi BETWEENdalam WHERE:

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE (users.signup_date BETWEEN CONCAT(CURDATE(), ' 00:00:00') AND CONCAT(CURDATE(), ' 23:59:59'))
Tanakom Talawat
sumber