MySQL Select Date gleich Today

95

Ich versuche, eine MySQL-Select-Anweisung auszuführen, bei der das heutige Datum angezeigt wird und nur Ergebnisse zurückgegeben werden, die an diesem aktuellen Tag registriert wurden. Ich habe derzeit Folgendes versucht, aber es scheint nicht zu funktionieren.

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

Ich habe meine SELECTAussage dahingehend geändert , danke Jungs.

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

Jako
quelle
es scheint, dass signup_datedas Datum / Uhrzeit-Feld ist
Sergii Stotskyi
@Serjio Ja, es ist derzeit ein Datum / Uhrzeit-Feld.
Jako
Was ist der Datentyp, signup_datewenn er die Uhrzeit enthält? Dann möchten Sie das Datumsformat in der WHEREKlausel verwenden, um die Uhrzeit zu entfernen , damit sie mit demCURDATE()
Taryn
@bluefeet danke, ich habe mein Skript geändert. Es scheint zu funktionieren, aber wenn es keine Ergebnisse gibt. mysql_num_rowszeigt 0 nicht an. Nur ein Leerzeichen.
Jako

Antworten:

197
SELECT users.id, DATE_FORMAT(users.signup_date, '%Y-%m-%d') 
FROM users 
WHERE DATE(signup_date) = CURDATE()
Barmar
quelle
Ist es notwendig, DATE () zu verwenden, auch wenn das Feld vom Typ Datum ist?
Rashidnk
2
@rashidnk Nein. Obwohl er in der Frage nicht klar gesagt hat, ist das Feld anscheinend vom Typ DATETIME.
Barmar
2
Diese Lösung ist zwar absolut korrekt, lässt sich jedoch nicht gut skalieren (ein Index kann nicht verwendet werden signup_date, selbst wenn ein solcher Index vorhanden ist). Bevorzugen Sie Serjios Lösung .
RandomSeed
oder wenn an einem bestimmten Datum gesucht werden soll, wobei der Index auch verwendet wird `` `SELECT users.id, DATE_FORMAT (users.signup_date, '% Y-% m-% d') FROM users where signup_date> = '2017-08 -30 00:00:00 'und signup_date <=' 2017-08-30 23:59:59 '; `` `
Sumit M Asok
3
@SumitMAsok Besser zu verwenden, < '2017-08-31 00:00:00'wenn Sie eine Version von MySQL mit Millisekunden verwenden.
Barmar
29

Diese Abfrage verwendet den Index, wenn Sie ihn für das signup_dateFeld haben

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
quelle
Abstimmungen zu dieser Antwort sind absurd. Dies ist in der Tat der bevorzugte Ansatz, da diese Abfrage im signup_dateGegensatz zu anderen Ansätzen einen Index nutzen kann.
RandomSeed
2
@RandomSeed Die allgemeine Idee, signup_datezwei Mal zu testen, ist korrekt, die Zeiten jedoch nicht. Es sollte zwischen 00:00und 23:59:59am aktuellen Datum liegen.
Barmar
Nun, das Datumsintervall war auch falsch. Die Abstimmungen waren doch nicht so absurd.
RandomSeed
Diese Abfrage ist viel leistungsfähiger (aufgrund des Index). Das WHERE DATE(signup_date) = CURDATE()hat meinen Server ~ 50 ms gekostet, dieser hier 0,8 ms.
Kai Noack
13

Klingt so, als müssten Sie die Formatierung hinzufügen zu WHERE:

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 mit Demo

Taryn
quelle
1

Sie können das CONCATwith CURDATE()für die gesamte Tageszeit verwenden und dann filtern, indem Sie die BETWEENin- WHEREBedingung verwenden:

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
quelle