Information ausblenden
Willkommen im Forum für alle Datenbanken! Registriere Dich kostenlos und diskutiere über DBs wie Mysql, MariaDB, Oracle, Sql-Server, Postgres, Access uvm

Unterschiedliche Date-Formate in Datenbank

Dieses Thema im Forum "MySQL und MariaDB" wurde erstellt von peter8500, 6 November 2013.

  1. peter8500

    peter8500 Benutzer

    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!
     
  2. akretschmer

    akretschmer Datenbank-Guru

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

    peter8500 Benutzer

    Das ist richtig. Ging aber leider bei der Importierung nicht. Wie kann ich das nachträglich anpassen ?
    Grüße und herzlichen Dank
     
  4. akretschmer

    akretschmer Datenbank-Guru

    ALTER TABLE, korrekte Syntax bitte der Doku entnehmen.
     
  5. peter8500

    peter8500 Benutzer

    Der Typ der Spalte ist bereits "DATE"
     
  6. peter8500

    peter8500 Benutzer

    So ist die Struktur
     

    Anhänge:

  7. ukulele

    ukulele Datenbank-Guru

    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.?
     
  8. peter8500

    peter8500 Benutzer

    Ukulele ich danke Dir vorab nochmals herzlich!!! Nein das sind die Formate. Reicht auch :-((
     
  9. ukulele

    ukulele Datenbank-Guru

  10. ukulele

    ukulele Datenbank-Guru

    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 und akretschmer gefällt das.
  11. akretschmer

    akretschmer Datenbank-Guru

    Sehr fleissig, @ukulele ;-)

    Ich weiß nicht, ob es in MySQL geht, in PG könnte man das sogar inplace machen, also das Feld von TEXT auf DATE ändern und dabei via einer USING-Funktion sagen, wie dies zu erfolgen hat. Wollt ich nur mal so anmerken...
     
  12. peter8500

    peter8500 Benutzer

    @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: 6 November 2013
  13. peter8500

    peter8500 Benutzer

    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
    
    
     
  14. akretschmer

    akretschmer Datenbank-Guru

    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!
     
    peter8500 gefällt das.
Die Seite wird geladen...

Diese Seite empfehlen

  1. Diese Seite verwendet Cookies. Wenn du dich weiterhin auf dieser Seite aufhältst, akzeptierst du unseren Einsatz von Cookies.
    Information ausblenden