Monatsliste erzeugen
AllesMeins
- php
1 Dennis0 AllesMeins1 Dennis0 AllesMeins0 RFZ
0 Nico0 fastix®
Hiho,
ich habe in einer Datenbank eine Reihe von Nachrichten, jeweils mit php Zeit Stamp, gespeichert. Nun möchte ich gerne eine Liste erzuegen mit allen Monaten/Jahren für die Nachrichten eigetragen sind. Fällt euch eine bessere Möglichkeit ein, als alle Zeitstamps auszulesen und für jeden zu errechnen in welchem Monat er liegt und daraus die Monatsliste zu erzeugen? Das kommt mir doch arg ressourcenverschwenderisch vor. Aber mir fällt keine bessere Methode ein. Hat sonstwer eine Idee?
Grüsse
Marc
Hi AllesMeins,
ich habe in einer Datenbank eine Reihe von Nachrichten, jeweils mit php Zeit Stamp, gespeichert.
Das ist nicht gut, du solltest die Daten besser in einem DATE oder DATETIME Feld im MySQL typischen Format speichern.
Nun möchte ich gerne eine Liste erzuegen mit allen Monaten/Jahren für die Nachrichten eigetragen sind.
Dann könntest du nämlich mit DATE_FORMAT das Datum so formatieren, dass du den Monat hast:
DATE_FORMAT(datumsfeld, '%m')
Jetzt müsstest du eigentlich mit GROUP BY an alle existierenden Monate drankommen:
SELECT
DATE_FORMAT(datumsfeld, '%m') AS monat
FROM
tabelle
GROUP BY
monat
Als Ergebnisliste hast du jetzt jeden vorkommenden Monat einmal.
Nun kannst du für jeden vorhandenen Monat ganz normal einen erneuten Query absetzen:
SELECT
was,
weiß,
ich,
was,
du,
brauchst
FROM
tabelle
WHERE
DATE_FORMAT(sendtime, '%m') = '[code lang=php]$voher_ausgelesener_monat
~~~'[/code]
Ganz ohne Zwischenschritt in PHP kommt man hier aber vermutlich dann doch nicht aus.
MfG, Dennis.
--
Mein SelfCode: [ie:{ fl:( br:> va:) ls:\[ fo:) rl:( n4:# ss:) de:\] js:| ch:{ sh:| mo:} zu:|](http://www.peter.in-berlin.de/projekte/selfcode/?code=ie%3A%7B+fl%3A%28+br%3A%3E+va%3A%29+ls%3A%5B+fo%3A%29+rl%3A%28+n4%3A%23+ss%3A%29+de%3A%5D+js%3A%7C+ch%3A%7B+sh%3A%7C+mo%3A%7D+zu%3A%7C)
That's life - Es gibt im Leben[tm] keine Zurück-Taste. ([Fabian Transchel](http://forum.de.selfhtml.org/archiv/2004/11/t94960/#m575374))
Hiho,
ich empfand die DATE Felder von MySQL immer als äusserst unpraktisch. Gibt es da irgendwelche Befehle mit denen ich leicht zwischen dem PHP Format und dem MySQL Format wechseln kann? Speziell wenn ich die Daten mit PHP weiterformatieren und dann irgendwie ausgeben will (oder der umgekehrte Weg aus PHP ein bestimmtest Datum in eine Tabelle zu bringen) empfand ich das immer als ziemlich unpraktisch.
Grüsse
Marc
Hi AllesMeins,
ich empfand die DATE Felder von MySQL immer als äusserst unpraktisch. Gibt es da irgendwelche Befehle mit denen ich leicht zwischen dem PHP Format und dem MySQL Format wechseln kann?
Um einen PHP Timestamp in MySQL Format umzuwandeln, welches ja YYYY-MM-DD HH:MM:SS ist, kannst du date() verwenden:
$mysqldate = date("Y-m-d H:i:s", $phptimestamp);
Ich weiß zwar nicht, ob es die beste Methode ist, aber es geht ;-)
Speziell wenn ich die Daten mit PHP weiterformatieren und dann irgendwie ausgeben will (oder der umgekehrte Weg aus PHP ein bestimmtest Datum in eine Tabelle zu bringen) empfand ich das immer als ziemlich unpraktisch.
Wenn du die Daten ausgeben willst, kannst du sie in MySQL direkt mit DATE_FORMAT() formatieren, also z.B.
SELECT DATE_FORMAT(datumsspalte, '%Y') AS jahreszahl
dann hast du, wenn du z.B. mysql_fetch_assoc() verwendest in $_ergebnis['jahreszahl'] das vierstellige Jahr drin stehen. Was es alles für Formatierungsmöglichkeiten, wie das %Y gibt, kannst du in der MySQL Referenz Datums- und Zeitfunktionen DATE_FORMAT() nachlesen.
Um einen UNIX Timestamp zu bekommen (den du dann mit PHP weiter verarbeiten kannst), sollte dir die MySQL Funktion UNIX_TIMESTAMP:
SELECT UNIX_TIMESTAMP(datumsspalte) AS timestamp
Dabei bin ich jetzt gerade, direkt unter der Funktion UNIX_TIMESTAMP noch auf eine Funktion names FROM_UNIXTIME gestoßen und siehe da - das ist die bessere Alternative zu dem „Gemurkse” mit date(), was ich vorhin da oben beschrieb:
FROM_UNIXTIME([code lang=php]$phptimestamp
)[/code]
Sollte sich z.B. in einem INSERT INTO verwenden lassen.
Hope it helps ;-)
MfG, Dennis.
Hiho,
danke für die Infos. Ich werde sie mir zu gemüte führen (aber nicht mehr heute - jetzt ist Schluss für heute)
Grüsse und gute Nacht
Marc
danke für die Infos. Ich werde sie mir zu gemüte führen (aber nicht mehr heute - jetzt ist Schluss für heute)
So kurz vorm Ziel? ;)
SELECT DATE_FORMAT(FROM_UNIXTIME(timestamp_spalte),'%m') AS monat GROUP BY monat;
Das dürft jetzt dem Query von Dennis entsprechen, nur mit dem Unterschied dass deine Tabellenspalte deinen Timestamp enthält, statt dem Datumsformat.
greetz RFZ
Hiho,
danke für die Infos. Ich werde sie mir zu gemüte führen (aber nicht mehr heute - jetzt ist Schluss für heute)
So kurz vorm Ziel? ;)
Ja! Denn es gibt ne ganze Menge schönerer Sachen, die man an einem Abend machen kann, als sich mit irgendwelchen blöden Monatslisten herumzuschlagen :)
Marc
Hallo!
Das einfachste ist wahrscheinlich, wenn du noch ne Spalte, in der der Monat steht hinzufügst.
Nico
Hi Nico,
Das einfachste ist wahrscheinlich, wenn du noch ne Spalte, in der der Monat steht hinzufügst.
Warum willst du die Datenbank mit weiteren Informationen belasten, die schon in einer anderen Spalte enthalten sind?
MfG, Dennis.
Das war ja blos ne Idee... Wenn das nur ein paar Zeilen sind, kommt es dann auf die paar byte auch nicht drauf an. Problematischer wirds dann bei größeren Tabellen. Deine Version ist da wahrscheinlich besser geeignet.
Nico
Moin!
ich habe in einer Datenbank eine Reihe von Nachrichten, jeweils mit php Zeit Stamp, gespeichert. Nun möchte ich gerne eine Liste erzuegen mit allen Monaten/Jahren für die Nachrichten eigetragen sind.
Hat sonstwer eine Idee?
Was ist ein "php Zeit Stamp"?
Lasse die Datenbank Monat und Jahr errechnen, concateniere die beiden Werte und lasse Dir diese Spalte sortiert und doublettenbereinigt ausgeben.
Das alles geht in einem SELECT. Du brauchst die concat, distinct und die Datumsfunktionen.
Das sollte hinreichend schnell gehen und ressourcen sparen...
MFFG (Mit freundlich- friedfertigem Grinsen)
fastix®