SQL Abfrage der letzten Monate

selberbauer

Captain
Registriert
Juni 2009
Beiträge
3.604
Hi,

ich hänge gerade an einer Datums-Abfrage in SQL.

Ich möchte die Namen der letzten fünf Monate abfragen, dass heisst, dass ich bsw. Februar, Januar, Dezember, November, Oktober am Ende herausbekomme.

Grund:
Ich möchte für eine Blog-Anwendung eine Seiteleiste anbieten, welche die Artikel nach Monat sortieren.
 
Dann poste mal einen Datensatz aus deiner Datenbank.
z.B. ID, Name, Datum, Uhrzeit, Betrag

Und steht dir PHP zur Verfügung?
 
Entweder du berechnest das, oder baust dir eine kleine Hilfstabelle:

Key Value
1 "Januar, Dezember, November, Oktober, September"
2 "Februar, Januar, Dezember, November, Oktober"
3 "März, ..."

oder

Key Value1, Value2, ..., Value5
1 "Januar", "Dezember", ...
2 "Februar", ...
3 "März", ...
 
In Oracle steht dir Add_Month zur Verfügung, in MySQL hast du z.B. Date_Sub. Welche DB hast du?

so long
 
Hi,

ich habe eine MySQL Datenbank.


Also eine Tabelle besteht aus:
id, title, author, content, createdAt, updatedAt

Nun könnte die Datenbank alle Objekte der letzten 5 Monate ausgeben und von jedem Monat einsverlangen.

Entweder du berechnest das, oder baust dir eine kleine Hilfstabelle:
Das Problem ist, dass es manchmal Monate gibt, wo man nichts in den Blog schriebt und Monate, wo der Blog noch neu ist..
 
Was für einen Typ haben deine Felder denn? Datetime, Timestamp?
 
Soweit ich weiß unterstützt MySQL IF oder IFNULL im Query, wenn du es also über ein einziges komplexes MySQL Query machen willst, wo du für die letzten fünf Monate überprüfst ob ein Eintrag existiert, dann kannst du für jeden der 5 Monate ein Subquery machen, in dem du mithilfe der Sub_Date Methode überprüfst, ob für den jeweiligen Zeitraum ein Eintrag existiert. Die Ausgabe kannst du dann bereits mit DATE_FORMAT(%M) vorformatieren.

Ist zwar nicht sehr wartungsfreundlich, aber das spielt vermutlich keine Rolle ;)
 
Also man selektiert die ganzen Dates, formatiert sie innerhalb des SQLs um, führt dann ein distinct drauf aus

Genau so müsste das gehen, leider finde ich nichtmal richtige SQL queries, die mir weiterhelfen könnten. DQL-Queries erst recht nicht....

Vermutlich muss ich mir was anderes ausdenken :(
 
mysql> SELECT DATE_FORMAT('1997-10-04 22:23:00', '%W %M %Y');
-> 'Saturday October 1997'

mit %M (großes M) bekommst du also den Monatsnamen eines Datums.
Jetzt ziehst von dem datum noch jeweild 5x 1Monat ab, dann hast du die letzten Monate
eines bestimmten datums.

Glaub die Funktion fürs aktuelle Datum ist CURDATE() in MYSQL.


Edit:
mysql> SELECT '1997-10-04 22:23:00' - INTERVAL 1 MONTH;
-> '1997-09-04 22:23:00'

Grüße
 
Zuletzt bearbeitet:
Hmm gibt es eigentlich auch noch eine einfache Möglichkeit ohne Datenbank die letzten 5 Monate mit deutschen Namen von PHP zu bekommen?
 
im Zweifel über ne clevere Kombination (unter anderem) aus ner Schleife, time() und strtotime("-$i month")
 
PHP:
$date = new DateTime();
for($i = 0; $i < 5; $i++) {
  echo $date->format('F');
  $date->sub(new DateInterval('P1M'));
}

so long
 
Ich habe noch eine Alternative: Du trennst deine kompletten DateTime Werte auf in: YYYY MM DD HH MM SS und dann speicherst du alles in seperaten Spalten in der DB. Damit wär die Abfrage extrem einfach, natürlich ist es nicht sonderlich 'schön'... aber einfach! :D
 
Warum sollte man das tun? Man kann doch die Datenbank bei Datetime-Spalten problemlos nach Day, Month, Year oder sonstwas fragen. Den Rest kann man problemlos über PHP lösen.
 
Zurück
Oben