Esteba: Zeitspanne zu Datum-Typ addieren

Hallo allerseits,

Ich möchte aus einer Tabelle in einer MySQL-Datenbank Einträge löschen, bei denen das Datum in der Spalte "gelesen" (gibt an, wann der Eintrag als "gelesen" markiert wurde) eine bestimmte Zeitspanne her ist, zum Beispiel 24 Stunden oder eine Woche. Wäre mit Timestamps natürlich kein Problem, ich möchte aber in dem Fall mit Datetime-Typen arbeiten. Wie löse ich das am elegantesten?

Ich hab mal ein bisschen rumgesucht und bin auf zwei Funktionen gestoßen:
Zum einen DATEDIFF, die mir aber nicht geeignet erscheint, weil sie ja zum Beispiel auch bei 23:59 und 0:01 Uhr bei zwei aufeinanderfolgenden Tagen eine Stunde als Unterschied angibt.
Zum anderen DATEADD, die eigentlich genau das ist, was ich gesucht habe. Beim Query "[...] WHERE DATEADD(Hour, 24, gelesen)<=NOW()" wird mir aber gemeldet "Unknown column 'Hour' in 'where clause'", was mich doch sehr verwundert, wo die Syntax in sämtlichen SQL-Tutorials genau so war. Ist die Funktion möglicherweise nur in Transact SQL verfügbar? Und was gibt es dann für Alternativen?

Gruß,
Esteba

  1. Hello,

    sehr löblich, dass du einen angemessenen Datentyp verwendest!

    Und was gibt es dann für Alternativen?

    siehe Handbuch Date and Time Functions

    MfG
    Rouven

    --
    -------------------
    sh:| fo:} ch:? rl:( br:& n4:{ ie:| mo:} va:) js:| de:] zu:| fl:( ss:) ls:& (SelfCode)
    Death is nature's way of telling you to slow down.
    1. Und was gibt es dann für Alternativen?
      siehe Handbuch Date and Time Functions

      Also DATE_ADD, mit "_". ^^

      Funktioniert, vielen Dank für die Hilfe. Werde in Zukunft als allererstes ins MySQL Referenzhandbuch schauen, wenn ich ein Problem mit SQL habe. ;)

      Gruß,
      Esteba

  2. echo $begrüßung;

    Ich möchte aus einer Tabelle in einer MySQL-Datenbank Einträge löschen, bei denen das Datum in der Spalte "gelesen" eine bestimmte Zeitspanne her ist, zum Beispiel 24 Stunden oder eine Woche. Wäre mit Timestamps natürlich kein Problem, ich möchte aber in dem Fall mit Datetime-Typen arbeiten. Wie löse ich das am elegantesten?

    Welchern Timstamp meinst du denn? Den Unix-Timestamp in einem INT-Feld gespeichert oder ein MySQL-TIMESTAMP-Feld? Mit letzterem kann man alle Datums- und Zeitfunktionen verwenden, die auch auf DATE, TIME, DATETIME anwendbar sind.

    Zum anderen DATEADD, die eigentlich genau das ist, was ich gesucht habe.

    DATE_ADD() kam ja schon als Antwort. Nebenbei: Verwendet man das in einer View schreibt MySQL das in die Form

    datumswert +/i INTERVAL wert einheit

    um. Das scheint ihm besser zu gefallen als DATE_ADD(datumswert,INTERVAL wert einheit). Wie auch immer.

    Es gibt nun zwei Notationsarten für dein Problem

    a) spalte + INTERVAL ... < NOW()
      b) spalte < NOW() - INTERVAL ...

    Zu bevorzugen wäre Variante b), denn dabei muss der Ausdruck »NOW() - INTERVAL ...« nur einmal berechnet werden und anschließend kann ein vorhandener Index auf der Spalte für den Vergleich verwendet werden. Bei a) muss stattdessen der Ausdruck für jeden Spaltenwert neu berechnet werden und ein Index kann auch nicht verwendet werden.

    echo "$verabschiedung $name";

    1. Welchern Timstamp meinst du denn? Den Unix-Timestamp in einem INT-Feld gespeichert oder ein MySQL-TIMESTAMP-Feld? Mit letzterem kann man alle Datums- und Zeitfunktionen verwenden, die auch auf DATE, TIME, DATETIME anwendbar sind.

      Jetzt, wo ich gelernt habe, wie man Additionen und Subtraktionen mit DATETIME-Typen durchführt, sehe ich in dem Fall so oder so keinen Vorteil mehr darin, einen Timestamp zu verwenden. ^^

      DATE_ADD() kam ja schon als Antwort. Nebenbei: Verwendet man das in einer View schreibt MySQL das in die Form

      datumswert +/i INTERVAL wert einheit

      um. Das scheint ihm besser zu gefallen als DATE_ADD(datumswert,INTERVAL wert einheit). Wie auch immer.

      Es gibt nun zwei Notationsarten für dein Problem

      a) spalte + INTERVAL ... < NOW()
        b) spalte < NOW() - INTERVAL ...

      OK, danke für den Tip. Sieht bei mir jetzt so aus:

      "[...] WHERE [...] AND (gelesen <= NOW() - INTERVAL 1 DAY)"

      Gruß,
      Esteba

      1. echo $begrüßung;

        Welchern Timstamp meinst du denn? Den Unix-Timestamp in einem INT-Feld gespeichert oder ein MySQL-TIMESTAMP-Feld? Mit letzterem kann man alle Datums- und Zeitfunktionen verwenden, die auch auf DATE, TIME, DATETIME anwendbar sind.

        Jetzt, wo ich gelernt habe, wie man Additionen und Subtraktionen mit DATETIME-Typen durchführt, sehe ich in dem Fall so oder so keinen Vorteil mehr darin, einen Timestamp zu verwenden. ^^

        Es steht immer noch die Frage offen, welche Sorte Timestamp du nun meinst. Ich gehe aber mal aus, dass du den Unix-Timestamp meinst, der die Sekunden seit 1.1.1970 UTC zählt. Der MySQL-Timestamp hat zwar den gleichen Wertebereich wie der Unix-Timestamp, stellt sich aber nach außen hin als normaler Datums-Zeit-Wert dar und kann auch so behandelt werden. Es gibt also für dem MySQL-Timestamp gegenüber den anderen MySQL-DateTime-Werten keinen Nachteil in der Verarbeitung.

        echo "$verabschiedung $name";

        1. Es steht immer noch die Frage offen, welche Sorte Timestamp du nun meinst. Ich gehe aber mal aus, dass du den Unix-Timestamp meinst, der die Sekunden seit 1.1.1970 UTC zählt. Der MySQL-Timestamp hat zwar den gleichen Wertebereich wie der Unix-Timestamp, stellt sich aber nach außen hin als normaler Datums-Zeit-Wert dar und kann auch so behandelt werden. Es gibt also für dem MySQL-Timestamp gegenüber den anderen MySQL-DateTime-Werten keinen Nachteil in der Verarbeitung.

          In der Verarbeitung nicht. Aber wie du schon sagtest hat der MySQL-Timestamp den selben Wertebereich wie der Unix-Timestamp. Und der ist in bestimmten Fällen ein Nachteil, oder nicht? ;)

          Ich will damit jetzt aber keine Grundsatzdiskussion "Timestamp oder Datetime" heraufbeschwören. ^^

          Gruß,
          Esteba

          1. echo $begrüßung;

            Aber wie du schon sagtest hat der MySQL-Timestamp den selben Wertebereich wie der Unix-Timestamp. Und der ist in bestimmten Fällen ein Nachteil, oder nicht? ;)

            Auch der MySQL-Timestamp mit seinem eingeschränkten Wertebereich gegenüber DateTime hat seine Existenzberechtigung. Zusammen mit der mit ihm verbundenen Magie beim Eintragen oder Ändern von Datensätzen eignet er sich (mindestens noch die nächsten 30 Jahre) gut um aktuelle Zeitwerte festzuhalten. DateTime hingegen kann nahezu beliebige Werte aus Vergangenheit oder Zukunft darstellen, braucht aber etwas mehr Speicher (was heutzutage jedoch kein gravierendes Kriterium mehr ist).

            Ich will damit jetzt aber keine Grundsatzdiskussion "Timestamp oder Datetime" heraufbeschwören.

            Das muss ja nicht sein, aber das Wort "Timestamp" ist zu ungenau, ohne zu spezifizieren, ob du einen Unix-Timestamp in Form eines Integers meinst oder einen Timestamp-Typ von MySQL, der ja außer dem Wertebereich eher wie ein DateTime aussieht.

            echo "$verabschiedung $name";