2012-03-24 15 views
1

Ich habe einige Termine in meiner DB im Format dd-mm-yy und einig in yy-mm-ddmySQL - Wie ändere ich das Datumsformat von TT-MM-JJ in JJ-MM-TT?

Ich mag, dass sie alle in yy-mm-dd seine

Sie gespeichert sind, in VARCHAR Felder

Beispiele Termine sind:

2011-10-19 und 19-10-2011

gibt es eine Abfrage zu einem Update auszuführen, die nicht in diesem Format sind?

Vielen Dank im Voraus!

+1

Wie speichern Sie Ihre Daten? Welche Art von Feld? ANyway, sieh dir das an: http://stackoverflow.com/questions/4259729/updating-a-date-format-in-mysql – Nobita

+0

Wie kannst du sagen, in welchem ​​Format sie sind? Wie zum Beispiel "09-10-11": ist das der 9. Oktober 2011 oder ist es der 11. Oktober? – ruakh

+0

Aktualisiert den Beitrag ruakh :) Cheers Nobita - sieht vor Ort auf – Franco

Antwort

3

Daten werden als Daten gespeichert, vermutlich haben Sie Strings.

Wenn sie bereits Daten sind, verwenden Sie einfach DATE_FORMAT wie benötigt.

Wenn sie Strings sind, Ihre würde die beste Wahl, sie zu tatsächlichen Daten zu ändern und den Datumswert in einer neuen Spalte speichern. Ansonsten wirst du weiterhin viele Probleme haben, wie Tony bemerkte (+1 Tony!).

Sie können dann mit STR_TO_DATE, z.

update tbl set new_date_field = 
select STR_TO_DATE(string_date_field,'%y-%m-%d') ` # if string_date_field is '2011-01-01' 
WHERE string_date_field RLIKE "^[0-9]{2}-"; 

Sobald Sie ein echtes Datum haben, können Sie es mit DATE_FORMAT(date_field, '%y-%m-%d')

Die einzige andere Option angezeigt, wenn Sie nicht hinzufügen, kann das Feld String-Manipulation zu tun ist, das heißt
Update table set date_field =
substr(string_date_field,7,2) + '-' + substr(string_date_field,3,2) + '-' + substr(string_date_field,0,2) WHERE string_date_field RLIKE "^[0-9]{2}-";

auch auf diese Weise Ich würde immer noch ein neues Feld empfehlen.

Hinweis: Wenn Sie es in noch mehr Schritten tun müssen, sagen Sie, dass Sie die Population des 'Datum als String'-Felds nicht sofort ändern können, können Sie auch einen Post-Insert/Post-Aktualisierungstrigger einfügen (mySQL jetzt unterstützt), die Konvertierung (vom String-Feld in das reale Datumsfeld) vorwärts zu machen.

+1

Das Speichern von Daten als Zeichenfolgen ist nur eine Menge Arbeit und Fehler. –

+0

+1 für die Verwendung von STR_TO_DATE. – wisefish

+0

Ihr Update fehlt ein 'WHERE datefield LIKE '__-__-____''. – glglgl

2

Man könnte so etwas wie dies versucht (aber zuerst ein Backup Ihrer Tabelle!):

UPDATE table SET string_date_field = STR_TO_DATE(string_date_field, "%d-%m-%Y") 
WHERE string_date_field RLIKE "^[0-9]{2}-"; 

RLIKE ein Synonym für REGEXP ist und Sie können die Datensätze zu finden, verwenden, wo das Datum in dem problematisch% d- % m-% Y-Format. Sie können anschließend die Tabelle ändern, so dass der Feldtyp DATE ist. Wenn Ihre Tabelle eine große Anzahl von Datensätzen enthält, sollten Sie dies möglicherweise in Intervallen tun, indem Sie ein fortlaufendes automatisches Inkrementierungsfeld verwenden (vorausgesetzt, dass eines vorhanden ist), um kleinere Sätze von Datensätzen für den Server zu erstellen. Zum Beispiel:

UPDATE table SET string_date_field = STR_TO_DATE(string_date_field, "%d-%m-%Y") 
WHERE ID >= 1000000 AND ID < 2000000 AND string_date_field RLIKE "^[0-9]{2}-"; 
Verwandte Themen