Netti: mysql5 Datum updaten

Hqallo,

ich habe einmal eine DATE-Spalte und einmal eine TIMESTAMP-Spalte und möchte beide mit einem neuen Datum versehen.

Beide Daten sollen von heute so weit entfernt sein, wie die Originaldaten von einem Referenzzeitpunkt X (in beligigem Format).

Ich habe das nun über die Eselsbrücke UNIX-Timestamp schon gelöst, aber ich frage mich, ob ich das nicht einfacher hätte lösen können??

Als Scriptsprache verwende ich php5.

Viele Grüße, Netti

  1. Hi!

    Beide Daten sollen von heute so weit entfernt sein, wie die Originaldaten von einem Referenzzeitpunkt X (in beligigem Format).
    Ich habe das nun über die Eselsbrücke UNIX-Timestamp schon gelöst, aber ich frage mich, ob ich das nicht einfacher hätte lösen können??

    spalte + INTERVAL ...

    Siehe MySQL-Handbuch -> Kapitel Funktionen -> Datum und Zeit -> Beschreibung zu DATE_ADD().

    Lo!

    1. Hi!

      Beide Daten sollen von heute so weit entfernt sein, wie die Originaldaten von einem Referenzzeitpunkt X (in beligigem Format).
      spalte + INTERVAL ...
      Siehe MySQL-Handbuch -> Kapitel Funktionen -> Datum und Zeit -> Beschreibung zu DATE_ADD().

      Ach ja, die Funktionen mit DIFF im Namen werden wohl auch noch gebraucht.

      Lo!

    2. Hi,

      Siehe MySQL-Handbuch -> Kapitel Funktionen -> Datum und Zeit -> Beschreibung zu DATE_ADD().

      Jau, das sieht schon sehr gut aus.

      Aber was ich suche ist sowas in folgender Art:

      update Spalte set

      Neues Datum = Heute - (Referenzdatum - Originaldatum)

      Gibt es in den mysql Datums- und Zeitfunktionen eine Möglichkeit, mit einem Datum (z.b. 21.11.2000) zu rechnen?

      Also:

      Neues Datum = now() - (21.11.2000 - Originaldatum)

      Oder so?

      Grüße, Netti

      1. Hi!

        Siehe MySQL-Handbuch -> Kapitel Funktionen -> Datum und Zeit -> Beschreibung zu DATE_ADD().
        Aber was ich suche ist sowas in folgender Art:
        update Spalte set
        Neues Datum = Heute - (Referenzdatum - Originaldatum)

        Wenn du (Referenzdatum - Originaldatum) rechnest (sollte DATEDIFF() können), bekommst du eine Anzahl Tage (ich nehme an, dass das Auflösung reicht). Diese kannst du mit dem heutigen Tag verrechnen: NOW() - INTERVAL x DAY. Gegebenenfalls müsstest du die Uhrzeit aus der gesamten Rechnung ausklammern erst am Ende wieder hinzufügen.

        Lo!

        1. Hallo dedlfix,

          Wenn du (Referenzdatum - Originaldatum) rechnest (sollte DATEDIFF() können), bekommst du eine Anzahl Tage (ich nehme an, dass das Auflösung reicht).

          Die Auflösung würde reichen, ja.

          Diese kannst du mit dem heutigen Tag verrechnen: NOW() - INTERVAL x DAY. Gegebenenfalls müsstest du die Uhrzeit aus der gesamten Rechnung ausklammern erst am Ende wieder hinzufügen.

          Wie klammert man die aus und fügt sie wieder hinzu?

          Sorry, wenn ich etwas doof daherfrage, aber das mysql-Handbuch und ich stehen ein wenig auf Kriegsfuß. Ich kann unglaublich schwer darin Dimnge verstehen. Geht mir glücklicherweise in keinem anderen Handbuch so.

          Grüße, Netti

          1. Hi,

            Versuch einer Query:

            UPDATE Tabelle SET
            Aenderungsdatum = now() - DATEDIFF('2009-11-10 23:59:59',Aenderungsdatum) where ID = 36;

            Leider setzt diese Query mir 0000:00:00 in die Spalte ein.

            Gruß, Netti

            1. Hi!

              UPDATE Tabelle SET
              Aenderungsdatum = now() - DATEDIFF('2009-11-10 23:59:59',Aenderungsdatum) where ID = 36;
              Leider setzt diese Query mir 0000:00:00 in die Spalte ein.

              Du kannst zum Probieren auch einfach "SELECT formel" nehmen, und kannst das Ergebnis prüfen, ohne den Inhalt der Tabelle zu beeinflussen.

              Ich weiß grad nicht, wie MySQL sich verhält, wenn du Datümer mit den Operatoren für Zahlen bearbeitest. DATEDIFF() liefert dir einen Tag. Zum Addieren auf einen anderen Zeitwert gibt es DATE_ADD() oder die gleichwertige Schreibweise mit INTERVAL

              CURDATE() - INTERVAL x DAY

              Und für x kommt in deinem Fall DATEDIFF(...) zum Einsatz.

              Lo!

              1. Hi,

                CURDATE() - INTERVAL x DAY

                Und für x kommt in deinem Fall DATEDIFF(...) zum Einsatz.

                Jaja. Soweit habe ich es verstanden.

                UPDATE Tabelle SET Aenderungsdatum = CURDATE() - INTERVAL (DATEDIFF('2009-11-11',Aenderungsdatum)) DAY WHERE ID = 36

                liefert ein korrektes Ergebnis ab.

                1. Frage: Kann mysql auch mit negativen Werten rechnen? Also wenn z.b. das Datum in der Spalte jünger wäre als besagter 11.11.2009?

                2. Frage: Ich habe zwar verstanden, dass ich mit ADDTIME() eine Zeit hinzufügen kann, aber ich weiß nicht, wie ich meine Query verändern muß, um zuvor eine  ggf. vorhandene Zeit "zwischenzulagern" und wie ich sie dann auch noch wieder hervorkramen kann, um sie anzuhängen.

                Viele Grüße, Netti

                1. Hi!

                  UPDATE Tabelle SET Aenderungsdatum = CURDATE() - INTERVAL (DATEDIFF('2009-11-11',Aenderungsdatum)) DAY WHERE ID = 36

                  Die Klammerung um DATEDIFF ist nicht notwendig.

                  1. Frage: Kann mysql auch mit negativen Werten rechnen? Also wenn z.b. das Datum in der Spalte jünger wäre als besagter 11.11.2009?

                  Warum nicht? Probier es aus.

                  1. Frage: Ich habe zwar verstanden, dass ich mit ADDTIME() eine Zeit hinzufügen kann, aber ich weiß nicht, wie ich meine Query verändern muß, um zuvor eine  ggf. vorhandene Zeit "zwischenzulagern" und wie ich sie dann auch noch wieder hervorkramen kann, um sie anzuhängen.

                  Zwischenlagern ist nicht erforderlich, nur eine Schachtlung von Funktionsaufrufen. Bilde zunächst Teile deiner Rechnung. Und genauso wie du den DATEDIFF-Teil in die INTERVAL-Notation eingefügt hast, kannst du den oben zu sehenden Ausdruck als ein Argument von ADDTIME() angebe. Das zweite wäre TIME(Aenderungsdatum).

                  Lo!

                  1. Hi dedlfix,

                    Zwischenlagern ist nicht erforderlich, nur eine Schachtlung von Funktionsaufrufen. Bilde zunächst Teile deiner Rechnung. Und genauso wie du den DATEDIFF-Teil in die INTERVAL-Notation eingefügt hast, kannst du den oben zu sehenden Ausdruck als ein Argument von ADDTIME() angebe. Das zweite wäre TIME(Aenderungsdatum).

                    Uff. Nicht ganz leicht.
                    Und an welcher Stelle eines Update-Query wird ADDTIME() notiert?
                    ich finde leider immer und überall nur SELECT-Statements, daher weiß ich das nicht.

                    Grüße, Netti

                    1. Uff. Nicht ganz leicht.
                      Und an welcher Stelle eines Update-Query wird ADDTIME() notiert?
                      ich finde leider immer und überall nur SELECT-Statements, daher weiß ich das nicht.

                      Aah...durch Zufall gefunden:

                      AND :-)

                      Danke für Deine Hilfe in diesem Thread.

                      Netti

                      1. Hi!

                        Uff. Nicht ganz leicht.
                        Und an welcher Stelle eines Update-Query wird ADDTIME() notiert?
                        ich finde leider immer und überall nur SELECT-Statements, daher weiß ich das nicht.

                        Allgemeine Ausdrücke unterscheiden sich nicht voneinander, egal ob sie in einem SELECT-Statement vs. anderen oder auch im SELECT-Teil vs. WHERE-Teil stehen. Deswegen empfahl ich ja, zum Probieren die Formel mit SELECT zu entwickeln. Wenn der Formel-Ausdruck dann fertig ist, kann er in die Zuweisung in einem UPDATE_Stetement eingefügt werden.

                        Aah...durch Zufall gefunden:
                        AND :-)

                        AND brauchst du dabei nicht. Du musst nur genauer lesen, was ich schreibe. Wenn ich sage, dass ein Argument von ADDTIME deine Formel ist und das andere der Zeit-Anteil, und man als Grundlagenwissen voraussetzen kann, dass das so notiert wird: ADDTIME(argument1, argument2), dann sollte klar sein, dass ADDTIME() "außen drumherum" steht.

                        Lo!

            2. Hallo,

              bei select DATEDIFF('2009-11-11 23:59:59',Aenderungsdatum) from Tabelle where ID = 36

              kommt 40 raus.

              Warum tuts denn dann diese hier nicht?

              UPDATE Tabelle SET
              Aenderungsdatum = now() - (DATEDIFF('2009-11-11 23:59:59',Aenderungsdatum)) where ArtikelID = 36

              ???

              Netti

              1. Hi!

                bei select DATEDIFF('2009-11-11 23:59:59',Aenderungsdatum) from Tabelle where ID = 36
                kommt 40 raus.

                Eine Zahl, die die Anzahl der Tage darstellt.

                Warum tuts denn dann diese hier nicht?
                UPDATE Tabelle SET
                Aenderungsdatum = now() - (DATEDIFF('2009-11-11 23:59:59',Aenderungsdatum)) where ArtikelID = 36

                Schau doch mal, was folgendes ergibt:

                SELECT NOW(), NOW() - 40

                Die 40 ist nur noch eine einfache Zahl. Dass das Tage darstellen sollen, ist MySQL nicht bekannt. Das Ergebnis von NOW() wird wegen der Subtraktion mit einer normalen Zahl auch in eine Zahl umgerechnet, allerdings werden einfach nur die Trennzeichen entfernt und nicht etwa der Wert in eine Sekundenanzahl (wie zum Beispiel beim Unix-Timestamp) umgerechnet. Wenn man von der Zahl 40 abzieht, ist also der ehemalige Teil der Sekunden betroffen. Im Falle eines Überlaufs werden auch die "Minuten" etc. beeinflusst. Da das Ganze nun aber eine Zahl darstellt, werden auch die überlaufenden Sekunden nicht von 60 aus, sondern von 100 aus berechnet, was ja für Zeiten nicht richtig ist. MySQL kann zwar für DATETIME-Werte auch trennzeichenlos notierte Werte interpretieren, aber die müssen einem gültigen Datum/Zeit-Wert entsprechen, sonst ergibt es NULL beziehungsweise dein beobachtetes 0000-00-00 00:00:00.

                Ungültige Werte werden sich aber nicht in allen deinen Rechen-Konstellationen ergeben, so dass du teilweise richtige Datums/Zeitwerte bekommst, aber mit Änderungen im Sekundenbereich. Die Lösung für richtiges Rechnen ist das schon in der ersten Antwort erwähnte Schlüsselwort INTERVAL.

                Lo!

          2. Hi!

            Diese kannst du mit dem heutigen Tag verrechnen: NOW() - INTERVAL x DAY. Gegebenenfalls müsstest du die Uhrzeit aus der gesamten Rechnung ausklammern erst am Ende wieder hinzufügen.
            Wie klammert man die aus und fügt sie wieder hinzu?

            Man nimmt vom Spaltenwert nur den Datumsanteil (DATE(...)) und macht seine Rechnungen. Anschließend kann man mit ADDTIME() den TIME()-Teil der Spalte hinzufügen. Zu beachten ist natürlich auch das was NOW() zurückgibt - CURDATE() wäre sicher angebrachter.

            Lo!