AllesMeins: Monatsliste erzeugen

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

  1. 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))
    
    1. 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

      1. 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.

        --
        Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
        Schon gewusst, dass Bugs und Feature Vorschläge für das CForum ins Entwicklerforum oder in den BugTracker von WWWTech gehören und nicht hier her?
        1. 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

          1. 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

            1. 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

  2. Hallo!

    Das einfachste ist wahrscheinlich, wenn du noch ne Spalte, in der der Monat steht hinzufügst.

    Nico

    1. 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.

      --
      Mein SelfCode: ie:{ fl:( br:> va:) ls:[ fo:) rl:( n4:# ss:) de:] js:| ch:{ sh:| mo:} zu:|
      Sinnvolles Zitieren: Man zitiert nur Teilsätze des Vorposters auf die man sich bezieht! Nicht einfach alles.
      1. 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

  3. 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®

    --
    Als Freiberufler bin ich immer auf der Suche nach Aufträgen: Schulungen, Development. Auch  für seriöse Agenturen.