2012-10-01 18 views
49

Ich versuche eine mysql select-Anweisung auszuführen, bei der das aktuelle Datum berücksichtigt wird und nur Ergebnisse zurückgegeben werden, die sich an diesem aktuellen Tag angemeldet haben. Ich habe momentan folgendes versucht, aber es scheint nicht zu funktionieren.MySQL Datum gleich heute auswählen

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

ich geändert habe meine SELECT Aussage dazu, Danke Jungs.

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

+0

es scheint, dass "signup_date" ist datetime Feld – Serjio

+0

@Serjio Ja, es ist derzeit ein Datetime-Feld. – Jako

+0

Was ist der Datentyp von 'signup_date' wenn er die Zeit enthält, dann wirst du das date_format in der' WHERE' Klausel benutzen um die Zeit zu entfernen um 'CURDATE()' – Taryn

Antwort

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

Ist es notwendig, DATE() zu verwenden, auch wenn das Feld vom Typ Date ist? – rashidnk

+1

@rashidnk Nein. Obwohl er in der Frage nicht klar gesagt hat, ist das Feld anscheinend vom Typ 'DATETIME'. – Barmar

+1

Während diese Lösung absolut korrekt ist, skaliert sie nicht gut (kann keinen Index für 'signup_date' verwenden, selbst wenn ein solcher Index existiert). Bevorzugt [Serjios Lösung] (http://stackoverflow.com/a/12677822/1446005). – RandomSeed

9

Klingt wie Sie die Formatierung der WHERE hinzufügen müssen:

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

Siehe SQL Fiddle with Demo

+5

Verabschieden Sie sich von Ihrer Leistung. Diese Abfrage verwendet nie den Index – Serjio

12

Diese Abfrage Index wird verwendet werden, wenn Sie es für signup_date Feld haben

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

Downvotes zu dieser Antwort sind absurd. Dies ist in der Tat der bevorzugte Ansatz, da diese Abfrage im Gegensatz zu anderen Ansätzen einen Index für "signup_date" nutzen könnte. – RandomSeed

+0

@RandomSeed Die generelle Idee, zwischen zwei Malen nach 'signup_date' zu ​​testen, ist richtig, aber die Zeiten nicht. Es sollte zwischen "00: 00" und "23: 59: 59" am aktuellen Datum liegen. – Barmar

+1

@Barmar Ja, Sie haben Recht. Ich habe die Antwort behoben. – RandomSeed

Verwandte Themen