han: monatliche listung von stetig wachsenden daten

Hallo,

ich habe eine MySql-Tabelle, in der nach und nach neue Einträge zussamen mit einem timestamp hinzukommen, d.h, die Tabelle erweitert sich stetig.

Nun möchte ich diese in Monate zusammenfassen, also besser gesagt für jeden existierenden Monat (je Jahr) einen Link anlegen, und dann auf der verlinkten Seite alle Datentypen dieses Monats ausgeben.

Wie löse ich das am Besten?
Wenn ich den ältesten und neusten timestamp der gesamten Tabelle abrufe, wie kann ich dann überprüfen wieviele und welche Monate in dieser Spanne liegen?

Wenn ich das dann mal geschafft habe, bruache ich ja um die passenden Daten aus der Tabelle zu hohlen den Monats-Beginn-Timestamp und den Monats-Ende-Timestamp, wie bekomme ich diese zu einem Variablen Monat?

griesle

  1. Hallo,

    Da Du hier nicht sagst, ob Du POSIX- oder MySQL-Timestamps meinst, halte ich die Antwort so allgemein, dass sie für beide gilt.

    Wenn ich den ältesten und neusten timestamp der gesamten Tabelle abrufe, wie kann ich dann überprüfen wieviele und welche Monate in dieser Spanne liegen?

    Naja, Du kannst ja Nummer des Jahres und Monats der beiden Timestamps bestimmen und der Rest ist relativ simpel (Du hast 12 Monate pro Jahr, Jahre werden kontinuierlich gezählt). D.h. wenn der erste Timestamp Jahr 2006, Monat 4 hat und der letzte Timestamp Jahr 2008, Monat 3, dann weißt Du, dass da genau 24 Monate eingeschlossen sind (inkl. ersten und letzten Monat). Dein Code sähe schematisch so aus:

    $monat = [monat des 1. timestamps];  
    $jahr = [monat des 1. timestamps];  
    $ende_monat = [monat des 2. timestamps];  
    $ende_jahr = [monat des 2. timestamps];  
      
    // solange wir das End-Datum noch nicht erreicht haben  
    while ($jahr < $ende_jahr || $monat < $ende_monat) {  
      // hier würde man den Link ausgeben  
      echo "Jahr: " . $jahr . ", Monat: " . $monat . "<br />\n";  
      $monat++;  
      // übertrag  
      if ($monat == 13) {  
        $monat = 1;  
        $jahr++;  
      }  
    }
    

    Wenn ich das dann mal geschafft habe, bruache ich ja um die passenden Daten aus der Tabelle zu hohlen den Monats-Beginn-Timestamp und den Monats-Ende-Timestamp, wie bekomme ich diese zu einem Variablen Monat?

    Naja, Du bekommst dann genau die Information "Monat" und "Jahr" - d.h. Du kannst den Timestamp berechnen, der am 1. Tag des Monats um Mitternacht liegt und Du kannst den Timestamp berechnen, der am letzten Tag des Monats um 23:59:59 liegt - und alles, was zwischen den beiden Timestamps (einschließlich dieser beider) liegt, liegt innerhalb des Monats - MySQL kann ja Vergleiche sowohl auf Zahlenfelder als auch auf Datumsfelder durchführen (WHERE feld >= anfang AND feld <= ende).

    Viele Grüße,
    Christian

    --
    "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup
    1. hi,

      Naja, Du kannst ja Nummer des Jahres und Monats der beiden Timestamps bestimmen und der Rest ist relativ simpel (Du hast 12 Monate pro Jahr, Jahre werden kontinuierlich gezählt).

      Da explizit nach "existierenden" Monaten gefragt war, dürfen wir vielleicht annehmen, dass es nicht in jedem Monat Einträge gibt.
      Wenn also nur für die "existierenden" Monate Links erzeugt werden sollen, dann wäre vielleicht erst mal eine Abfrage nach Jahr-Monat mit DISTINCT oder GROUP BY angebracht.

      Naja, Du bekommst dann genau die Information "Monat" und "Jahr" - d.h. Du kannst den Timestamp berechnen, der am 1. Tag des Monats um Mitternacht liegt und Du kannst den Timestamp berechnen, der am letzten Tag des Monats um 23:59:59 liegt - und alles, was zwischen den beiden Timestamps (einschließlich dieser beider) liegt, liegt innerhalb des Monats - MySQL kann ja Vergleiche sowohl auf Zahlenfelder als auch auf Datumsfelder durchführen (WHERE feld >= anfang AND feld <= ende).

      Wenn ein DBMS vorliegt, was solche Datumsfunktionen unterstützt, wäre eine Abfrage mittels YEAR() und MONTH() o.ä. vielleicht schöner, also sich Timestamps zusammenzubasteln.

      gruß,
      wahsaga

      --
      /voodoo.css:
      #GeorgeWBush { position:absolute; bottom:-6ft; }
      1. Hallo wahsaga,

        Naja, Du kannst ja Nummer des Jahres und Monats der beiden Timestamps bestimmen und der Rest ist relativ simpel (Du hast 12 Monate pro Jahr, Jahre werden kontinuierlich gezählt).

        Da explizit nach "existierenden" Monaten gefragt war, dürfen wir vielleicht annehmen, dass es nicht in jedem Monat Einträge gibt.
        Wenn also nur für die "existierenden" Monate Links erzeugt werden sollen, dann wäre vielleicht erst mal eine Abfrage nach Jahr-Monat mit DISTINCT oder GROUP BY angebracht.

        Das geht allerdings nur, wenn's DBMS- und keine POSIX-Timestamps sind - aus letzteren kann man nämlich nicht so ohne weiteres ablesen, in welchem Monat sie angegeben sind.

        Ferner weiß ich nicht, inwiefern MySQL Datenfelder intelligent indizieren kann - wenn's wirklich viele Daten sind, sind Funktionen wie SELECT DISTINCT YEAR(datumsfeld), MONTH(datumsfeld) FROM tabelle evtl. relativ langsam, weil sie einen Full Table Scan provozieren könnten - das müsste man mittels EXPLAIN mal überprüfen, ob MySQL intelligent genug ist, da einen Index zu verwenden.

        Naja, Du bekommst dann genau die Information "Monat" und "Jahr" - d.h. Du kannst den Timestamp berechnen, der am 1. Tag des Monats um Mitternacht liegt und Du kannst den Timestamp berechnen, der am letzten Tag des Monats um 23:59:59 liegt - und alles, was zwischen den beiden Timestamps (einschließlich dieser beider) liegt, liegt innerhalb des Monats - MySQL kann ja Vergleiche sowohl auf Zahlenfelder als auch auf Datumsfelder durchführen (WHERE feld >= anfang AND feld <= ende).

        Wenn ein DBMS vorliegt, was solche Datumsfunktionen unterstützt, wäre eine Abfrage mittels YEAR() und MONTH() o.ä. vielleicht schöner, also sich Timestamps zusammenzubasteln.

        Ja, das stimmt, gilt allerdings auch nur, wenn obige beide Bedingungen erfüllt sind (d.h. Datenbank-Timestamps + MySQL intelligent genug).

        Viele Grüße,
        Christian

        --
        "I have always wished for my computer to be as easy to use as my telephone; my wish has come true because I can no longer figure out how to use my telephone." - Bjarne Stroustrup