Constantin Kiesling: Rechnen mit Datum

Hallo liebe Community!

Ich habe da eine Frage, wäre toll, wenn ihr mir helfen könntet! Und zwar: Ich möchte eine Art "Suche/Verkaufe-Seite" auf meiner Homepage einrichten. Jedes Inserat soll aber nicht länger als z.B. 60 Tage angezeigt werden.

Also habe ich mir gedacht, ich speichere einfach das Erstellungsdatum in ein extra Feld in der Tabelle der MySQL Datenbank. Aber wie gehe ich dann weiter vor? Wie kann ich im Ausgabeskript nur die Inserate anzeigen lassen, die jünger als 60 Tage sind?

Wäre über Tipps wirklich sehr froh!

Danke im Voraus,
Constantin

  1. Hallo,
    arbeite doch mit dem Timestamp.

    Speicher den Timestamp und die WHERE-Klause sieht ca. so aus:
    SELECT * FROM inserat WHERE einstelldatum >= ".(time()-(3600*24*60))

    MFG

    1. Hallo!

      Danke für die Idee! Habe sowas noch nie gemacht, daher meine wohl eher dumme Frage...

      Danke nochmals!
      Constantin

    2. Speicher den Timestamp und die WHERE-Klause sieht ca. so aus:
      SELECT * FROM inserat WHERE einstelldatum >= ".(time()-(3600*24*60))

      Das geht an den zwei Tagen im Jahr, an denen die Zeit umgestellt wird, möglicherweise schief. Außerdem ist es unnötig, MySQL kann sehr gut direkt mit Daten rechnen:

      einstelldatum >= now()-interval 60 day

      Grüngrüß.

      1. Hi,

        einstelldatum >= now()-interval 60 day

        Aber ist dann das Feld "einstelldatum" immer noch ein timestamp oder irgendwas anderes?

        lG,
        Constantin

        1. einstelldatum >= now()-interval 60 day

          Aber ist dann das Feld "einstelldatum" immer noch ein timestamp oder irgendwas anderes?

          Wenn du den reichhaltigen Fundus an MySQL-Datums- und Zeitfunktionen nutzen willst, sollte der Spaltentyp datetime oder date sein.

          Der MySQL-Typ timestamp enthält das gleiche wie datetime, wird aber von MySQL bei jeder Änderung des Datensatzes automatisch auf die aktuelle Zeit gesetzt.
          Der MySQL-Typ timestamp hat nichts mit dem Unix-Timestamp zu tun (den auch PHP verwendet). Der Unix-Timestamp ist eine Ganzzahl, die die Sekunden seit 1970 darstellt und kontinuierlich aufwärts gezählt wird. MySQL-Datums- und Zeittypen (datetime, date, timestamp, time) stellen den Zeitpunkt direkt lesbar dar, MySQL 20050703103800 (2005 Juli 3. 10:38:00) entspricht dem Unix-Timestamp 1120379880.

          Der Vorteil der MySQL-Typen sollte offensichtlich sein, ist aber unterm Strich Geschmackssache. In jedem Fall kann zwischen Unix-Timestamp und MySQL-Typen mit den MySQL-Funktionen unix_timestamp() bzw from_unixtime() umgerechnet werden.

          Willst du ausschließlich den Unix-Timestamp benutzen und auf die MySQL-Funktionen verzichten, muss der Spaltentyp mindestens INT sein.

          Grüngruß.

          1. echo $begrüßung;

            Einspruch Euer Ehren!

            Der MySQL-Typ timestamp enthält das gleiche wie datetime,

            Der Wertebereich von TIMESTAMP geht nur von 1970 bis ins Jahr 2037. Das ist der gleiche Wertebereich wie der Unix-Timestamp. Ein DATETIME unterstützt dagegen Werte zwischen 1.1.1000[*] bis <1.1.10000. Außerdem muss ein TIMESTAMP-Wert einem gültigen Datum (incl. Uhrzeit) entsprechen, ein DATETIME dagegen kann bspw. auch 0.0.1974 oder 31.2.8019 enthalten. Die Gründe verrät das Manual (gleich am Anfang).

            wird aber von MySQL bei jeder Änderung des Datensatzes automatisch auf die aktuelle Zeit gesetzt.

            Dies gilt nur für den ersten TIMESTAMP-Wert und bis MySQL 4.0. Ab Version 4.1 gibt es Änderungen ( siehe die beiden Unterkapitel von http://dev.mysql.com/doc/mysql/en/datetime.html).

            Der MySQL-Typ timestamp hat nichts mit dem Unix-Timestamp zu tun (den auch PHP verwendet).

            Er hat den gleichen Wertebereich, siehe oben. Nur die Darstellung ist anders.

            MySQL[-Timestamp] 20050703103800 (2005 Juli 3. 10:38:00) entspricht dem Unix-Timestamp 1120379880.

            Die Default-Formatierung von TIMESTAMP ist ab MySQL 4.1 die gleiche wie von DATETIME, also 2005-07-03 10:38:00.

            In jedem Fall kann zwischen Unix-Timestamp und MySQL-Typen mit den MySQL-Funktionen unix_timestamp() bzw from_unixtime() umgerechnet werden.

            Ja, aber auch nur innerhalb des Wertebereichs von Unix-/MySQL-Timestamps.

            echo "$verabschiedung $name";

            [*] offiziell. Inoffiziell kann er auch keinere Werte enthalten, für die aber MySQL keine Garantie übernimmt.

            1. Der MySQL-Typ timestamp hat nichts mit dem Unix-Timestamp zu tun (den auch PHP verwendet).

              Er hat den gleichen Wertebereich, siehe oben. Nur die Darstellung ist anders.

              "Nur" ist gut, das ist der große Haken an der ganzen Angelegenheit. Der Wertebereich ist zumindest im vorliegenden Fall herzlich nebensächlich.

              Der Punkt ist, dass man Unix-Timestamp und MySQL-Timestamp nicht einfach austauschen kann, die beiden Typen lassen sich weder direkt vergleichen noch verhalten sie sich bei Berechnungen gleich. Sie können denselben Zeitpunkt darstellen, aber es sind nicht die gleichen Typen.

              MySQL[-Timestamp] 20050703103800 (2005 Juli 3. 10:38:00) entspricht dem Unix-Timestamp 1120379880.

              Die Default-Formatierung von TIMESTAMP ist ab MySQL 4.1 die gleiche wie von DATETIME, also 2005-07-03 10:38:00.

              Who cares, bei MySQL lassen sich Datum und Zeit auf verschiedene Art und Weisen angeben. Ich ziehe das Eintippen von 20050703103800 jenem von "2005-07-03 10:38:00" vor.
              Außerdem geht es darum, die grundverschiedenen Werte für denselben Zeitpunkt herauszustellen.

              In jedem Fall kann zwischen Unix-Timestamp und MySQL-Typen mit den MySQL-Funktionen unix_timestamp() bzw from_unixtime() umgerechnet werden.

              Ja, aber auch nur innerhalb des Wertebereichs von Unix-/MySQL-Timestamps.

              Naja, das beim Umwandeln in einen Unix-Timestamp nur ein Unix-Timestamp rauskommen kann, mit all seinen Stärken und Schwächen, finde ich eigentlich nur logisch.

              Grüngrüß.

              1. echo $begrüßung;

                Der MySQL-Typ timestamp hat nichts mit dem Unix-Timestamp zu tun (den auch PHP verwendet).

                Er hat den gleichen Wertebereich, siehe oben. Nur die Darstellung ist anders.

                "Nur" ist gut, das ist der große Haken an der ganzen Angelegenheit.

                Ich seh da nur ein Häkchen, über das manch einer stolpert, wenn er übersieht, dass MySQL zur Darstellung/Rückgabe eine andere Formatierung verwendet als PHP/Unix.

                Der Punkt ist, dass man Unix-Timestamp und MySQL-Timestamp nicht einfach austauschen kann, die beiden Typen lassen sich weder direkt vergleichen noch verhalten sie sich bei Berechnungen gleich.

                Du solltest dir lieber Gedanken machen, wo du nun diese Berechnungen vornehmen lassen willst. Lass es MySQL machen, es bietet genug Funktionen dafür (auch zur Formatierung). Oder gib es in der Unix-Timstamp-Formatierung aus und lass die Anwendung rechnen. Da irgendwas zu vermischen dürfte nicht gerade die Übersichtlichkeit erhöhen.

                Außerdem geht es darum, die grundverschiedenen Werte für denselben Zeitpunkt herauszustellen.

                Es sind keine "grundverschiedenen" Werte, nur die Darstellung ist anders. Der eine stellt es als (fast) lesbares Datum dar, der andere als Anzahl von Sekunden. "Dreiviertel Acht" und "Viertel vor Acht" sind auch nicht "grundverschieden", nur die Darstellung ist anders.

                echo "$verabschiedung $name";

                1. Der MySQL-Typ timestamp hat nichts mit dem Unix-Timestamp zu tun (den auch PHP verwendet).

                  Er hat den gleichen Wertebereich, siehe oben. Nur die Darstellung ist anders.

                  "Nur" ist gut, das ist der große Haken an der ganzen Angelegenheit.

                  Ich seh da nur ein Häkchen, über das manch einer stolpert, wenn er übersieht, dass MySQL zur Darstellung/Rückgabe eine andere Formatierung verwendet als PHP/Unix.

                  Wie schön, dass du schlussendlich doch einsiehst, dass man auf diesen Umstand hinweisen sollte, weil er im Gegensatz zum Wertebereich eine potentielle Fehlerquelle darstellt.

                  Grüngrüß.

                  1. echo $begrüßung;

                    Ich seh da nur ein Häkchen, über das manch einer stolpert, wenn er übersieht, dass MySQL zur Darstellung/Rückgabe eine andere Formatierung verwendet als PHP/Unix.

                    Wie schön, dass du schlussendlich doch einsiehst, dass man auf diesen Umstand hinweisen sollte, weil er im Gegensatz zum Wertebereich eine potentielle Fehlerquelle darstellt.

                    Ich wüsste nicht, was es daran für mich noch einzusehen geben soll. Als Anfänger bin auch ich damals darüber gestolpert. Doch das wars dann, den Fehler hab ich nicht noch einmal gemacht.
                    Außerdem habe ich schon genügend Postings von offensichtlichen MySQL-Neulingen gesehen und beantwortet, die auch diesen Unterschied nicht kannten.
                    Alles in allem ist das aber nur einer der kleineren Stolpersteinchen, die man schon beim Erstellen des Scripts kennenlernt und korrigiert. Bedeutender finde ich dagegen vergessene Maskierungen, unbedacht übernommene, ungeprüfte Eingabewerte und nicht beachtete Wertebereiche da deren Auswirkungen nicht immer gleich zu Tage treten.

                    echo "$verabschiedung $name";

    3. Hallo,

      Speicher den Timestamp und die WHERE-Klause sieht ca. so aus:
      SELECT * FROM inserat WHERE einstelldatum >= ".(time()-(3600*24*60))

      Achja... was mir noch aufgefallen ist: Warum setzt du eigentlich ein Anführungszeichen und einen Punkt vor die Klammer?

      lG,
      Constantin