[gelöst/close] csv auf mysql und ändern des datumsformat

snakegott

Klamm - TippElite
ID: 155392
L
21 April 2006
1.156
74
Hallo,

ich brauche mal wieder eure Hilfe.

Ich habe eine .csv -Datei vorliegen Struktur:
z.b.

01.01.2010;0;1;...;1
02.01.2010;1;0;...;0
03.01.2010;1;1;...;1

Diese importiere ich mittels LOAD DATA in eine mysql tabelle diese hat folgende tabellenstruktur:

datum|00:00-00:15|00:15-00:30|...|23:45-24:00|id
01.01.2010|0|1|...|1|1
02.01.2010|1|0|...|0|2
03.01.2010|1|1|...|1|3
...

Jedoch kann ich mit diesem Datumsformat nichts anfangen. Ich brauche folgendes Datumsformat: z.b. 2010-10-31 (Jahr-Monat-Tag)

Ich habe schon versucht mit eine Lösung zu schaffen. Zuerst wollte ich den Umweg über PHP machen bis mir eingefallen/aufgefallen ist das mysql das ja auch selbst kann. Das habe ich dann auch soweit hinbekommen.

PHP:
SELECT STR_TO_DATE('1.01.2010', '%d.%m.%Y');
-> 2010-01-01

Nun habe ich aber eine bestehende .csv Struktur die nicht abgeändert werden kann. Kann man mittels mysql einen datensatz mit sich selbst updaten?

Ziel soll also folgendes sein (am besten soweit wie möglich automatisiert)

datum|00:00-00:15|00:15-00:30|...|23:45-24:00|id
2010-01-01|0|1|...|1|1
2010-01-02|1|0|...|0|2
2010-01-03|1|1|...|1|3
...

oder macht es vielleicht mehr Sinn die .csv abzuändern?

Gruß snakegott
 
Zuletzt bearbeitet:
Die CSV-Datei hast du mit einem Suchen&Ersetzen-Befehl abgeändert.

Alternativ kannst du in MySQL ne temporäre Tabelle zu diesem Zweck anlegen, die du erst mit dem falschen Format (VARCHAR-Spalte) lädst und dann per INSERT INTO SELECT + Funktionen in das richtige Format (DATE-Spalte) überträgst.

Ich würde Ersteres machen, weil das ne Sache von nur n paar Sekunden is.
 
ja sicher könnte ich die csv-datei händisch abändern, aber wie ich bereits gesagt habe, soll das ziel ein so weit wie möglicher automatismus sein.

Ich könnte ja die entsprechenden zeilen (via mysql -> php -> mysql) ausgeben und abändern lassen, aber ich dachte mir das ich das auch komplett via mysql machen kann. Wollte mir den schritt über php sparen.

ich hatte mir das mittels mysql so vorgestellt:

entsprechende felder makieren und gemäßt des eingenen inhalt im neuen datumsformat updaten, aber das scheint nicht zu funktionieren.

PHP:
UPDATE forecast SET `datum` = (SELECT STR_TO_DATE('datum', '%d.%m.%Y'))

wobei das datum im folgenden teil "SELECT STR_TO_DATE('datum', '%d.%m.%Y')" das datum entspricht was (gerade noch) aktuell ist.

gibt es derart möglichkeiten?

[edit]

wenn ich die genannte snytax genauer definiere funktioniert das ja, siehe hier:
PHP:
UPDATE forecast SET `datum` = SELECT STR_TO_DATE('1.07.2010', '%d.%m.%Y') WHERE `datum` = '1.07.2010'

[/edit]
 
Du kannst kein Datum in ne Datumsspalte bringen, wenn es nicht im MySQL-Format yyyy-mm-dd is. Wie gesagt: temporäre Tabelle, wenn es alles in MySQL sein muss.
 
Irgendwie wollte das nicht in meinen kopf mit der tmp tbl bis ich gerafft wie du das mit dem 'date' bzw. 'varchar' meintest. Habs dann aber doch verstanden. Habe es nun mittels temptabelle gemacht und läuft auch:

Hier die steps

PHP:
LOAD DATA INFILE
SELECT `datum` FROM forecast_tmp
UPDATE forecast_tmp SET `datum` = (SELECT STR_TO_DATE('$faildate', '%d.%m.%Y')) WHERE `datum` = '$faildate'
INSERT INTO forecast SELECT * FROM forecast_tmp
TRUNCATE TABLE `forecast_tmp`

Wobei sicherlich ein "REPLACE" besser wäre als ein INSERT. Hatte ich noch nicht geändern / probiert.

Thema geklärt, kann also geschlossen werden.