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()


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()

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)

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


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'))
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.