Unterschiedliche Date-Formate in Datenbank

peter8500

Benutzer
Beiträge
7
Hallo! Ich habe eine MySQL-Datenbank in der ich verschiedene Excellisten per CSV importiert habe.

Leider hab ich folgendes Problem:

Die Datumsformate sind teilweise 2013-12-01 und 01.12.2013 bzw. KW8.

Wie gehe ich am besten vor damit ich die Datumsformate in gleicher Schreibweise bringe ?

Herzlichen Dank!
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.731
Hallo! Ich habe eine MySQL-Datenbank in der ich verschiedene Excellisten per CSV importiert habe.

Leider hab ich folgendes Problem:

Die Datumsformate sind teilweise 2013-12-01 und 01.12.2013 bzw. KW8.

Wie gehe ich am besten vor damit ich die Datumsformate in gleicher Schreibweise bringe ?

Herzlichen Dank!

Korrekte / passende Datentypen verwenden. Das sollte insbesondere bei MySQL doch einfach sein, da die Anzahl der verfügbaren Typen ja doch, ähm, übersichtlich ist ...
 

ukulele

Datenbank-Guru
Beiträge
4.702
Wie kann in DATE KW8 stehen? DATE lässt nur ein Datumsformat zu. Ich tippe du hast einen VARCHAR oder dergleichen. Sind die 3 Schreibweisen die einzigen oder gibt es noch mehr Wildwuchs mit Leerschritten, unterschiedlichen Jahreszahlen etc.?
 

ukulele

Datenbank-Guru
Beiträge
4.702
Hier mal ein Beispiel. Die Ausgangsspalte ist VARCHAR, befüllt wird eine neue Spalte DATE:
Code:
CREATE TABLE test(
    ausgangsstring VARCHAR(10),
    fertigesdatum DATETIME
    );

INSERT INTO test(ausgangsstring) VALUES('2013-12-01');
INSERT INTO test(ausgangsstring) VALUES('01.12.2013');
INSERT INTO test(ausgangsstring) VALUES('KW8');

SELECT    *
FROM    test

-- result
2013-12-01    NULL
01.12.2013    NULL
KW8            NULL

UPDATE    test
SET        fertigesdatum = cast(ausgangsstring AS DATETIME)
WHERE    ausgangsstring LIKE '%.%.%'

UPDATE    test
SET        fertigesdatum = cast(left(ausgangsstring,4) + '-' + right(ausgangsstring,2) + '-' + left(right(ausgangsstring,5),2) AS DATETIME)
WHERE    ausgangsstring LIKE '%-%-%'

SELECT    *
FROM    test

-- result
2013-12-01    2013-12-01 00:00:00.000
01.12.2013    2013-12-01 00:00:00.000
KW8            NULL
Für KW muss noch eine Lösung gebastelt werden, Ansatz gibt es hier (allerdings erstmal für MSSQL), aber dafür brauch man ja irgendwie auch noch das Jahr:
http://stackoverflow.com/questions/607817/get-dates-from-a-week-number-in-t-sql
 

peter8500

Benutzer
Beiträge
7
@ukulele.. Du bist ne Wucht! Danke auch an akretschmer. Bin noch unterwegs und werde es gleich testen. Ihr könnt Euch schon mal was überlegen, wie ich Euch eine Freude machen kann...
 
Zuletzt bearbeitet:

peter8500

Benutzer
Beiträge
7
Vielen Dank nochmals. Hab alles mit Copy&Paste übertragen. Bis zu den Updaten-Anweisungen klappt alles. Nach der Ausführung der UPDATE bekomme ich
folgende Ausgabe:


Code:
SELECT * FROM  `test`

ausgangsstring fertigesdatum
2013-12-01 NULL
01.12.2013 2001-12-20 13:00:00
KW8 NULL
 
Werbung:

akretschmer

Datenbank-Guru
Beiträge
9.731
Vielen Dank nochmals. Hab alles mit Copy&Paste übertragen. Bis zu den Updaten-Anweisungen klappt alles. Nach der Ausführung der UPDATE bekomme ich
folgende Ausgabe:


Code:
SELECT * FROM  `test`

ausgangsstring fertigesdatum
2013-12-01 NULL
01.12.2013 2001-12-20 13:00:00
KW8 NULL

Tja, ich hab es denn auch mal probiert...

Du hast:

Code:
test=*# select * from peter8500 ;
  datum
------------
 2013-12-01
 01.12.2013
 kw8
(3 rows)

Time: 0,142 ms
test=*# \d peter8500
 Table "public.peter8500"
 Column | Type | Modifiers
--------+------+-----------
 datum  | text |

Nun wird gezaubert:

Code:
test=*# alter table peter8500 alter column datum type date using case when datum ~ '^\d\d\d\d' then to_date(datum, 'yyyy-mm-dd') when datum ~ '\d\d\.\d\d\.\d\d' then to_date(datum, 'mm.dd.yyyy') when datum ~ 'kw\d' then to_date('2013 ' || regexp_replace(datum, 'kw',''), 'YYYY WW') else null end ;
ALTER TABLE
Time: 6,323 ms
test=*# select * from peter8500 ;
  datum
------------
 2013-12-01
 2013-01-12
 2013-02-19
(3 rows)

Time: 0,200 ms
test=*# \d peter8500 ;
 Table "public.peter8500"
 Column | Type | Modifiers
--------+------+-----------
 datum  | date |

Fertig!
 
Oben