Timestamps pro Datum/Std zählen

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Timestamps pro Datum/Std zählen

    Man stelle sich eine Tabelle mit nur einem Feld 'timestamp', das Unix Zeitstempel enthält, vor. Nun würde ich gern zählen, wieviele timestamps (für z.B. einen Tag/Datum oder Stunde) vorhanden sind. Das funktioniert auch mit folgender Abfrage recht gut.

    Quellcode

    1. SELECT
    2. FROM_UNIXTIME(timestamp,"%Y-%m-%d") as date,
    3. COUNT(timestamp) AS count
    4. FROM table GROUP BY date ORDER BY date ASC

    Die Abfrage liefert z.b. folgendes Ergebnis:

    Quellcode

    1. 2007-02-01 21
    2. 2007-02-02 15
    3. 2007-02-04 2
    4. 2007-02-05 6

    In dieser Datenmenge fehlt aber ein, für mich wichtiger, Eintrag,
    nämlich der für 2007-02-03. Da für diesen Tag kein Stempel vorhanden ist wird der Tag auch nicht ausgeben. Ich bräuchte diesen Tag allerdings.
    Daher brauch ich eine Abfrage die folgendes Ergebnis leifert:

    Quellcode

    1. 2007-02-01 21
    2. 2007-02-02 15
    3. 2007-02-03 0 <= wichtig !
    4. 2007-02-04 2
    5. 2007-02-05 6

    Kann mir evtl hierbei jemand helfen ? Ich hoffe, ich hab das Problem ausreichend beschrieben.
    Schreib Artikel gegen Geld - Lupuz.de - Die offene Artikel Community
  • Ja, das Problem ist klar. Verstehe auch, dass man sowas haben will, aber ich glaube schlichtweg nicht, dass es so einfach möglich ist. SQL kann sich den Tag schließlich nicht von irgendwo herbei zaubern.

    Mit einer Stored Procedure und einer Schleife von MIN(timestamp) bis MAX(timestamp) sollte das gehen. Aber ich denke, dass es hier viel leichter ist es auf Seiten der Programmiersprache umzusetzen.
  • Ich vermutete schon fast sowas ... an eine Subquery die alle daten zw Min(stamp) und MAX(stamp) ausgibt hab ich auch schon gedacht. Aber das scheint auch nicht so einfach zu funktionieren. Finde jedenfals nichts hilfreiches.

    Programmiersprache wäre hier PHP, an eine Funktion die die leeren stellen auffühlt habe ich auch schon gedacht. Aber Problem ist hier, dass man das ja nicht so einfach pauschalisieren kann. "Ein Monat hat 30 Tage" is ja nicht immer richtig, mal ganz abgesehn von Schaltjahren usw. Daher hab ich mich an sowas auch noch nicht drangesetzt. Ich denke immer "Das muss doch auch sauberer gehen".
    Schreib Artikel gegen Geld - Lupuz.de - Die offene Artikel Community
  • Vielleicht hilft dir folgende Idee:

    Du bestimmst den minimalen und den maximalen timestamp und baust in einer Schleife ein Array mit einen Eintrag pro Tag:

    In jedem Schleifendurchlauf erhöhst du den aktuellen Timestamp ts um 86400 (Anzahl Sekunden pro Tag), wandelst ihn in ein Datum und erstellst einen entsprechenden Arrayeintrag. Damit hast du für alle Tage zwischen min und max ein Feld im Array. Um solche Dinge wie Schlatjahr kümmert sich dabei die date-Funktion.

    Quellcode

    1. for (ts=min_ts; i<max_ts; i=i+86400)
    2. d = date("%Y-%m-%d", ts);
    3. count[d] = Ergebnis der Abfrage für Datum d


    Ob das so klappt, weiß ich nicht - aber eventuell hilft es dir ja als Ausgangspunkt zum Probieren.


    Grüße,
    Paul