MySQL Query - Aufzeichnungen zwischen heute und den letzten 30 Tagen

122

Ich möchte alle Datensätze zurückgeben, die in den letzten 30 Tagen zur Datenbank hinzugefügt wurden. Ich muss das Datum aus Anzeigegründen in MM / TT / JJ konvertieren.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Meine Anweisung beschränkt die Datensätze nicht auf die letzten 30 Tage - sie wählt alle Datensätze aus.

Kann mich jemand in die richtige Richtung weisen? Es fühlt sich an, als wäre ich nah dran.

Danke und eine tolle Woche.

Jason Sweet
quelle

Antworten:

291

Sie müssen DATE_FORMATin der SELECTKlausel anwenden , nicht in der WHEREKlausel:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

Beachten Sie auch, dass CURDATE()nur der DATETeil des Datums zurückgegeben wird. Wenn Sie also create_dateals DATETIMEmit dem gefüllten Zeitteil speichern , werden bei dieser Abfrage die heutigen Datensätze nicht ausgewählt.

In diesem Fall müssen Sie NOWstattdessen Folgendes verwenden :

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
quelle
Der zweite Teil dieser Antwort ist sehr wichtig! Möglicherweise hatte ich dieses Problem oder auch nicht, und ich kratzte mir am Kopf, bis ich auf diese Antwort zurückkam.
Tyler Lazenby
@ Quassnoi Es tut mir leid. Dies scheint nur ein WordPress \ wpdb-Vorbereitungsproblem zu sein. Entschuldigung nochmal.
Vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
quelle
2
Ich ziehe diese Methode ZWISCHEN CURDATE () - INTERVALL 30
Dan
1
@ErmSo kann ich wissen warum?
schlank
3
Ich werde nicht lügen - das war vor 2 Jahren und ich kann mich nicht erinnern! Entschuldigung: P
Dan
1
Keine Notwendigkeit zu verwendenDATE_FORMAT(create_date, '%m/%d/%Y')
Kazy
@Dan Ich ziehe es vor, es lesbarer zu machen, indem ich das vorherige Datum in Klammern setze: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig
10

DATE_FORMATGibt eine Zeichenfolge zurück, sodass Sie in Ihrer BETWEENKlausel zwei Zeichenfolgen verwenden , die nicht wie erwartet funktionieren.

Konvertieren Sie stattdessen das Datum in Ihr Format in SELECTund führen Sie das BETWEENfür die tatsächlichen Daten aus. Beispielsweise,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
Rich Adams
quelle
9

Sie können dies auch in MySQL schreiben -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

FEST

Rohit Suthar
quelle
2
Achtung: Trotz der Up-Votes werden Daten in den nächsten 30 Tagen / Monat ausgewählt, nicht in den letzten 30 Tagen!
JonBrave
4
Einverstanden, sollte WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH) sein;
Bhavik P.
6

Verwenden Sie diese Option für die Aktivität des aktuellen Datums und die vollständige Aktivität der letzten 30 Tage, da das SYSDATE an einem Tag variabel ist und der vorherige 30. Tag nicht die gesamten Daten für diesen Tag enthält.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
nur meine Erfahrung
quelle
1

Hier ist eine Lösung ohne curdate()Funktion, das ist eine Lösung für diejenigen , die verwenden , TSQLich denke ,

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
quelle