Hallo Ute,
Also ich habe mir jetzt zu Testzwecken eine neue Tabelle angelegt, ein neues Feld (date) eingefügt und mal ein paar Daten manuell eingeben. Und siehe jetzt funktioniert auch die Berechnung mit datediff(). Bis dahin alles prima.
Nur ist es ja sehr mühselig, alle Daten von Hand zu ändern und mit der str-to-date kann ich nicht viel anfangen, weil ich nicht weiß, wie ich das umsetzen soll.
nun dafür gibt es die UPDATE-Anweisung.
CURDATE() liefert doch in YYYYMMDD und mein Datumsfeld zeigt: DD- M-YYYY
hmm wirklich in diesem Format, d.h.
07- 4-2009
oder eher
07-4-2009
oder
7-4-2009
oder doch
07-04-2009
Das genaue Format spielt eine wichtige Rolle, denn das Handbuch zeigt Dir, welche Formatspezifizierer Du nehmen musst.
Der erste Fall mit einem Leerzeichen wäre ganz schlimm. Dann müsstest Du noch Zwischenschritte vornehmen.
Baue Dir im ersten Schritt ein SELECT-Statement zusammen, dass Dir Deine Spalte mit str_to_date in ein Datum umwandelt, zum Beispiel im Fall von
07-04-2009
hätten wir:
Tage mit führender Null: %d
Bindestrich: -
Monate mit führender Null: %m
Bindestrich: -
Jahreszahl, vierstellig: %Y
somit kämen wir auf
SELECT
pf_datum1, -- das Originalformat
STR_TO_DATE(
pf_datum1, -- erster Parameter ist der Inhalt der Spalte im
-- Originalformat
'%d-%m-%Y' -- zweiter der Formatstring gemäß 07-04-2009
) umgewandelt -- mal wieder ein netter Spaltenname
-- ich verzichte auf AS, weil nicht jedes DBMS das
-- AS versteht
FROM -- aus der Tabelle, in
data -- der die Spalte mit dem Originalformat steht
-- ich weiß nicht, welche das ist
Wenn dies zufriedenstellende Ergebnisse liefert, so füge der Tabelle, die das Originalformat enthält, eine weitere Spalte vom Typ date hinzu und gib ihr einen vernünftigen Namen.
Anschließend fülle die neue Spalte mit einer UPDATE-Anweisung mit den umgewandelten Daten:
UPDATE
tabelle
SET
neue_datums_spalte = STR_TO_DATE(
pf_datum1,
'%d-%m-%Y'
)
Da Deine Anwendung vermutlich nur die Spalte im Originalformat füllt, wäre es angebracht, mittels Trigger dafür zu sorgen, dass bei jedem Neueintrag und jeder Änderung der Originalspalte die neue Datumsspalte gefüllt wird.
Alternativ kannst Du DATEDIFF auch mit
DATEDIFF(
CURDATE(),
STR_TO_DATE(pf_datum1, '%d-%m-%Y')
)
füttern.
Bitte denke daran, genau die Formatspezifizierer zu verwenden, die Du benötigst. Das können andere sein als ich hier beispielhaft aufgeführt habe.
Hast Du wirklich ein Leerzeichen drin, dann musst Du dieses zuerst eliminieren (mit geeigneten Stringfunktionen), damit Du STR_TO_DATE anwenden kannst.
Ich finde, das ist ein schönes Beispiel dafür, warum man beim Tabellendesign den am besten passenden Datentyp des DBMS verwenden sollte - und dass beliebte und verbreitete Software wie hier
Es ist eine Profilfeld in einem phpbb-Forum.
oft schludert nach dem Motto: "wird ja sonst nicht benötigt ...".
Freundliche Grüße
Vinzenz