kostenloser Webspace werbefrei: lima-city


Zählen wie oft ein Datum in einer Datenbank vorhanden ist

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    jhb

    Kostenloser Webspace von jhb

    jhb hat kostenlosen Webspace.

    Hi,

    Ich versuch mal mein anliegen zu beschreiben,
    Also ich habe eine tag/date">Datenbank-Tabelle die etwa so auf gebaut ist


    id | datum | stuff
    1__2.4.13__text
    2__2.4.13__text
    3__3.4.13__text
    ...


    jetzt möchte ich auslesen wie viele verschiedene Tage in der Tabelle sind, in diesem Fall wären es 2.
    soweit so gut, allerdings habe ich nicht die Daten als solche gespeichert wie hier, sondern als Timestamp.

    Jetzt steh ich irgendwie auf dem schlauch wie ich das anstellen sollte.
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Kann ein Tag bei dir auch mehrere Male vorkommen? Dann wäre das mit Count Distinct zu lösen. Ansonsten mit einem einfachen Count in deinem Query. Kannst du ja mal googeln und bisschen rein lesen, einfach nur die Codezeile wird dir nicht viel bringen, wenn du später mal wieder das gleiche Problem hast. :)

    Beitrag zuletzt geändert: 18.1.2014 15:41:53 von c143
  4. Autor dieses Themas

    jhb

    Kostenloser Webspace von jhb

    jhb hat kostenlosen Webspace.

    Ja das ist es ja eben das mehrere Tage häufiger vorkommen, da ich allerdings den Timestamp gespeichert habe funktioniert das mit Count Distinct eben nicht, da der Timestamp auch std. min. und sec. beinhaltet.
    Hoffe ich irre mich da jetzt nicht.
  5. jhb schrieb:
    Ja das ist es ja eben das mehrere Tage häufiger vorkommen, da ich allerdings den Timestamp gespeichert habe funktioniert das mit Count Distinct eben nicht, da der Timestamp auch std. min. und sec. beinhaltet.
    Hoffe ich irre mich da jetzt nicht.


    $timestamp = time();
    $datum = date("d.m.Y",$timestamp);
    $timestamp =  strtotime($datum);
    echo $timestamp;


    Hier hast du deinen Zeitstempel im Format d.m.Y. Am besten googelst du die Funktion strtotime noch.
  6. Autor dieses Themas

    jhb

    Kostenloser Webspace von jhb

    jhb hat kostenlosen Webspace.

    hmm Okay vermutlich habe ich mich wohl schlecht ausgedrückt.
    Wie man Timestamp ins Datum und wieder zurück wandelt weiß ich.

    Also vielleicht nochmal anders, ich habe eine DB-Tabelle in der bei jedem Datensatz ein timestamp gespeichert ist.
    jetzt möchte ich gerne wissen wie viele verschiedene Daten (Mehrzahl von Datum) ich in meiner Tabelle habe, also wie viele Unterschiedliche tage. OHNE das dabei die Uhrzeit berücksichtigt wird.

    Der Befehl "Count Distinct" prüft soweit ich weiß nur Einträge die identisch sind. Ich habe aber nur Unterschiedliche Timestamps in der Tabelle.
  7. h***e

    Lese alle Daten als array ein und zähle die Anzahl gleicher Werte.
    http://www.lima-city.de/thread/php-gleiche-werte-aus-array-sammeln-und-zaehlen

    Beitrag zuletzt geändert: 18.1.2014 19:37:32 von hpage
  8. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    Wie wärs so?
    SELECT COUNT(DISTINCT DATE(datum)) FROM tabelle;
  9. jhb schrieb:
    hmm Okay vermutlich habe ich mich wohl schlecht ausgedrückt.
    Wie man Timestamp ins Datum und wieder zurück wandelt weiß ich.


    Das ist keine normale Umwandlung. Google doch mal, was ich dir vorgeschlagen habe. Der normale Timestamp wird in einen umgewandelt mit dem Format Jahr, Monat, Tag. Ohne Minuten oder Sekunden, genau das was du wolltest.

    hackyourlife schrieb:
    Wie wärs so?
    SELECT COUNT(DISTINCT DATE(datum)) FROM tabelle;

    Das habe ich schon vorgeschlagen, aber genau das kann er jetzt mit dem umgewandelten Timestamp machen.


    Aber ich erklärs jetzt nochmal:

    $timestamp = time();
    $datum = date("d.m.Y",$timestamp);
    $timestamp =  strtotime($datum);
    echo $timestamp;


    1) Mit der ersten Zeile holst du dir den normalen Timestamp MIT Sekunden. Nur ist ja jetzt jeder Eintrag Unique, wie du vorhin auch selbst geschrieben hast.
    2) In der zweiten Zeile wird der Zeitstempel in ein normales Datum umgewandelt -> 18.01.2014. Du siehst, die Sekunden und Minuten fehlen so.
    3) Das normale Datum wird wieder in einen Zeitstempel umgewandelt. Da jetzt aber keine Sekunden und Minuteangabe gemacht wurde, wird diese auch nicht eingetragen.

    Damit hast du Zeitstempel, die für jeden Tag identifizierbar sind und du kannst sie mit MySQL zählen.

    Beitrag zuletzt geändert: 18.1.2014 20:25:55 von c143
  10. hackyourlife

    Moderator Kostenloser Webspace von hackyourlife

    hackyourlife hat kostenlosen Webspace.

    c143 schrieb:
    hackyourlife schrieb:
    Wie wärs so?
    SELECT COUNT(DISTINCT DATE(datum)) FROM tabelle;

    Das habe ich schon vorgeschlagen, aber genau das kann er jetzt mit dem umgewandelten Timestamp machen.
    Entweder überseh ich das gerade, oder du hast nirgendwo eine entsprechende Lösung gebracht, die die Anzahl der verschiedenen Tage ausspuckt … und PHP ist hier keine Lösung (warum das so ist: siehe weiter unten).

    Aber ich erklärs jetzt nochmal:

    $timestamp = time();
    $datum = date("d.m.Y",$timestamp);
    $timestamp =  strtotime($datum);
    echo $timestamp;
    Wozu sollte man zuerst die Daten von MySQL nach PHP holen, sie dort irgendwie manipulieren, und dann irgendwie zu Zählen anfangen?

    Wenn ich das richtig verstanden habe, geht es darum herauszufinden, wie viele verschiedene Tage in der Datenbank gespeichert sind, wobei dort nur Timestamps enthalten sind.

    Da es nur um die Anzahl der Datensätze geht, ist es beträchtlich schneller und ressourcensparender, diese mit einem einzelnen SQL-Statement zu ermitteln, als mit einer Mischung aus SQL und PHP.
  11. hackyourlife schrieb:
    Entweder überseh ich das gerade, oder du hast nirgendwo eine entsprechende Lösung gebracht, die die Anzahl der verschiedenen Tage ausspuckt … und PHP ist hier keine Lösung (warum das so ist: siehe weiter unten).


    c143 schrieb:
    Kann ein Tag bei dir auch mehrere Male vorkommen? Dann wäre das mit Count Distinct zu lösen.


    Mein erster Post

    hackyourlife schrieb:
    Wozu sollte man zuerst die Daten von MySQL nach PHP holen, sie dort irgendwie manipulieren, und dann irgendwie zu Zählen anfangen?


    jhb schrieb:
    Ja das ist es ja eben das mehrere Tage häufiger vorkommen, da ich allerdings den Timestamp gespeichert habe funktioniert das mit Count Distinct eben nicht, da der Timestamp auch std. min. und sec. beinhaltet.


    Darum. Wenn du einfach die normalen Timestamp zählst, wird jede verschiedene Sekunde gezählt, nicht jeder verschiedene Tag.

    Beim auslesen hast du schon recht, da stimmt dein Query auch perfekt. Nur bevor er das Datum einträgt, muss er den Timestamp so verändern, dass die Sekunden und Minuten nicht dabei sind. Das war mein Ziel mit dem kleinen PHP Script.
  12. Dein Problem ist eher ein Designproblem. Bevor du dich damit quälst Workarounds zu finden, um die Tage zu zählen, würde ich dir vorschlagen anstatt Timestamps mit Typ integer einfach den MySQL internen Typ "datetime" zu nutzen.
    Das ist einerseits einfacher, wenn du direkt mit den Daten arbeitest, und anderseits hast du solche Probleme, wie du es jetzt hast, nicht.
    Auf dem Feld des Typs "datetime" kannst du dann wunderbar sämtliche MySQL internen Funktion laufen lassen.
    http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html
  13. Autor dieses Themas

    jhb

    Kostenloser Webspace von jhb

    jhb hat kostenlosen Webspace.

    lucas9991 schrieb:
    Dein Problem ist eher ein Designproblem. Bevor du dich damit quälst Workarounds zu finden, um die Tage zu zählen, würde ich dir vorschlagen anstatt Timestamps mit Typ integer einfach den MySQL internen Typ "datetime" zu nutzen.
    Das ist einerseits einfacher, wenn du direkt mit den Daten arbeitest, und anderseits hast du solche Probleme, wie du es jetzt hast, nicht.
    Auf dem Feld des Typs "datetime" kannst du dann wunderbar sämtliche MySQL internen Funktion laufen lassen.
    http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html


    Ja die funktion hab ich auch schon entdeckt, aber die DB um die es geht ist schon etwas älter, und damals glaube ich ich wäre flexibler wenn ich den Timestamp speichere, da ich die Uhrzeit letzten endlich auch noch für etwas anderes brauche.

    An die anderen, Ihr habt das Problem jetzt schon sehr gut zusammengefasst, mein Problem ist derzeit das ich nicht weiss wie ich das ganze lösen soll.
  14. Ich würde mir jetzt ein Feld anlegen mit datetime. Danach dann alle Timestamps so umwandel wie du es brauchst und dann in die DB schreiben. Danach kannst du dann so vorgehen, wie hackyourlife es beschrieben hat.

    Dafür kann man auch schnell ein kleines Script schreiben und nicht alles per Hand umtragen.
  15. jhb schrieb:
    lucas9991 schrieb:
    Dein Problem ist eher ein Designproblem. Bevor du dich damit quälst Workarounds zu finden, um die Tage zu zählen, würde ich dir vorschlagen anstatt Timestamps mit Typ integer einfach den MySQL internen Typ "datetime" zu nutzen.
    Das ist einerseits einfacher, wenn du direkt mit den Daten arbeitest, und anderseits hast du solche Probleme, wie du es jetzt hast, nicht.
    Auf dem Feld des Typs "datetime" kannst du dann wunderbar sämtliche MySQL internen Funktion laufen lassen.
    http://dev.mysql.com/doc/refman/5.6/en/date-and-time-functions.html


    Ja die funktion hab ich auch schon entdeckt, aber die DB um die es geht ist schon etwas älter, und damals glaube ich ich wäre flexibler wenn ich den Timestamp speichere, da ich die Uhrzeit letzten endlich auch noch für etwas anderes brauche.

    An die anderen, Ihr habt das Problem jetzt schon sehr gut zusammengefasst, mein Problem ist derzeit das ich nicht weiss wie ich das ganze lösen soll.

    Es gibt (heutzutage) eigentlich keinen Grund mehr den timestamp abzuspeichern.
    Bringt IMHO nur noch Nachteile mit sich.
    - kann man nicht direkt lesen
    - nur für begrenzten Zeitraum nutzbar
    - schwierig bei Umrechnung
    - generell schwierig beim Arbeiten mit mehren Daten

    PHP bringt mittlerweile auch eine praktische interne DateTime Klasse mit, mit der sich Rechenoperationen sehr einfach und elegant lösen lassen.
    http://de3.php.net/manual/de/class.datetime.php
    Musst nur checken ob die PHP 5 Version >= 5.2.0 (für DateTimeInterface) auf dem Zielsystem schon vorhanden ist, da es zum jetztigen Zeitpunkt noch "recht neu" ist.

    Ergo würde ich dir wirklich stark empfehlen darüber nachzudenken zu switchen. Ansonsten hast du weitere Lösungvorschläge doch schon hier im Thread erhalten. :)
  16. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!