Vinzenz Mai: Datumsdifferenz berechnen

Beitrag lesen

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