dedlfix: mysql5 Datum updaten: Query ?? Wer verstehts?

Beitrag lesen

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!