MySQL Seçimi Bugüne Eşit Tarih


99

Bugünün tarihine baktığı ve yalnızca o gün kaydolan sonuçları döndürdüğü bir mysql select deyimi çalıştırmaya çalışıyorum. Şu anda aşağıdakileri denedim, ancak işe yaramadı.

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

İfademi buna göre değiştirdim SELECT, teşekkürler çocuklar.

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


bu signup_datetarih saat alanı gibi görünüyor
Sergii Stotskyi

@Serjio Evet, şu anda bir datetime alanı.
Jako

signup_dateeğer zamanı içeriyorsa , veri türü nedir, o zaman WHEREcümlecikteki date_format'ıCURDATE()
Taryn

@ bluefeet teşekkürler, senaryomu değiştirdim. İşe yarıyor gibi görünüyor, ancak sonuç olmadığında. mysql_num_rows0 göstermiyor. Sadece boşluk.
Jako

Yanıtlar:


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

alan Tarih türü olsa bile DATE () kullanmak gerekli midir?
rashidnk

2
@rashidnk Hayır. Soruda açıkça söylemese de, alan görünüşe göre tipte DATETIME.
Barmar

2
Bu çözüm kesinlikle doğru olsa da, iyi ölçeklenemez ( signup_dateböyle bir dizin mevcut olsa bile üzerinde bir dizin kullanamaz ). Serjio'nun çözümünü tercih edin .
RandomSeed

veya belirli bir tarihte bulunacaksa, dizin de kullanılıyorsa, `` SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM users where signup_date> = '2017-08 -30 00:00:00 've signup_date <=' 2017-08-30 23:59:59 '; `` `
Sumit M Asok

3
@SumitMAsok < '2017-08-31 00:00:00'MySQL'in milisaniyelik bir sürümünü kullanıyorsanız kullanmak daha iyidir .
Barmar

30

signup_dateAlan için varsa bu sorgu dizini kullanacak

SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
    FROM users 
    WHERE signup_date >= CURDATE() && signup_date < (CURDATE() + INTERVAL 1 DAY)

1
Bu yanıta yönelik olumsuz oylar saçmadır. Aslında bu, tercih edilen yaklaşımdır, çünkü bu sorgu signup_date, diğer yaklaşımların aksine, bir dizinden yararlanabilecektir .
RandomSeed

2
@RandomSeed signup_dateİki kez arasında test etme genel fikri doğrudur, ancak zamanlar değildir. Geçerli tarih arasında 00:00ve 23:59:59tarih arasında olmalıdır .
Barmar

Tarih aralığı da yanlıştı>. <Sonuçta olumsuz oylar o kadar da saçma değildi.
RandomSeed

Bu sorgu çok daha başarılıdır (dizin nedeniyle). WHERE DATE(signup_date) = CURDATE()Burada bu bir 0.8 ms, ~ 50 ms benim sunucu aldı.
Kai Noack

13

Biçimlendirmeyi şuraya eklemeniz gerekiyor gibi görünüyor WHERE:

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

Demo ile SQL Fiddle'ı görün


1

Sen kullanabilirsiniz CONCATile CURDATE()günün tüm zaman ve kullanarak daha sonra filtreye BETWEENde WHEREdurum:

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'))
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.