2010-01-11 9 views
85

Ich möchte alle Datensätze zurückgeben, die innerhalb der letzten 30 Tage zur Datenbank hinzugefügt wurden. Ich muss das Datum in mm/dd/yy wegen der Anzeigezwecke umwandeln.MySQL Query - Datensätze zwischen heute und den letzten 30 Tagen

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

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

Vielen Dank und eine schöne Woche.

Antwort

201

Sie müssen DATE_FORMAT in der SELECT Klausel anzuwenden, nicht die WHERE Klausel:

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() gibt nur den DATE Teil des Datums, also, wenn Sie speichern create_date als DATETIME mit der Zeit Portion gefüllt, wird diese Abfrage nicht die heutigen Datensätze auswählen.

In diesem Fall müssen Sie NOW stattdessen verwenden:

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

danke es hat für mich funktioniert. – Brij

+1

Vielen Dank für die Erklärung, wie es funktioniert, wenn man eine Spalte DATETIME hat. Genial! – Adam

+0

nach vielen Suchen endlich gefunden. ;) +1 und Gute Erklärung –

8

DATE_FORMAT gibt einen String zurück, so dass Sie zwei Strings in Ihrem BETWEEN-Klausel, die, wie Sie nicht zur Arbeit gehen erwarten von.

Konvertieren Sie stattdessen das Datum in Ihr Format in der SELECT und tun Sie die BETWEEN für die tatsächlichen Daten. Zum Beispiel

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted 
FROM table 
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE() 
46
SELECT 
    * 
FROM 
    <table_name> 
WHERE 
    <date_field> BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) 
AND NOW(); 
+2

Ich bevorzuge diese Methode zu BETWEEN CURDATE() - INTERVAL 30 – Dan

+0

@ErmSo kann ich wissen warum? – slim

+1

Ich werde nicht lügen - das war vor 2 Jahren und ich kann mich nicht erinnern! Entschuldigung: P – Dan

4

Für die aktuelle Datum Aktivität und vollständige Aktivität für letzte 30 Tage nutzen dies, da die SYSDATE an einem Tag des vorherige 30. Tag variabel ist, wird die gesamten Daten für diesen Tag nicht hat.

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

Sie können auch diese mysql in schreiben -

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

ich so etwas tun würde:

SELECT DATE_FORMAT(create_date, '%m/%d/%Y') 
FROM mytable 
WHERE create_date >= (CURDATE() - INTERVAL 30 DAY) 
+0

Dies wird Daten Datensätze über CURDATE() hinaus zeigen. – xam

-1

Hier ist eine Lösung ohne curdate() Funktion zu verwenden, ist dies eine Lösung für diejenigen, wer benutzt TSQL Ich schätze

SELECT myDate 
FROM myTable 
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE() 
Verwandte Themen