Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 15

Thema: Konvertierung von varchar(16) auf timestamp

  1. #1
    drooper ist offline Benutzer
    Registriert seit
    05.08.2009
    Beiträge
    81

    Standard Konvertierung von varchar(16) auf timestamp

    Hallo,

    ich habe da ein mehr oder weniger großer Problem. Ich muss Daten von Oracle 8i testweise auf PostgreSQL 8.4 portieren. Unter Oracle 8i gab es noch keinen timestamp, so dass man sich mit varchar(16) ausgeholfen hat.
    Doch wenn schon, dann sollen diese Strings bei der Portierung in einen timestamp umgewandelt werden. Geht ja prinzipiell über die Funktion to_timestamp. Doch handelt es sich hierbei im mehrere Milliarden Datensätze, so dass ein Insert Trigger, welche die Umwandlung übernimmt einiges an Performace kosten wird.
    Ich dachte, dass man bei, Create Table statement irgendwie das einzufügende Format für date angeben kann, doch finde ich nichts in der Doku und auch Google verrät nichts in der Hinsicht.

    Muss ich das wirklich über einen Trigger machen, oder habt ihr eine andere Idee?

    Ich danke schon mal im Voraus ganz herzlich.

    mfg
    Marcus

  2. #2
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von drooper Beitrag anzeigen
    Hallo,

    ich habe da ein mehr oder weniger großer Problem. Ich muss Daten von Oracle 8i testweise auf PostgreSQL 8.4 portieren. Unter Oracle 8i gab es noch keinen timestamp, so dass man sich mit varchar(16) ausgeholfen hat.
    Doch wenn schon, dann sollen diese Strings bei der Portierung in einen timestamp umgewandelt werden. Geht ja prinzipiell über die Funktion to_timestamp. Doch handelt es sich hierbei im mehrere Milliarden Datensätze,
    Wie kommen denn die Daten rein? Bei der Masse doch sicherlich via COPY, oder?

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  3. #3
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Zitat Zitat von drooper Beitrag anzeigen
    Ich dachte, dass man bei, Create Table statement irgendwie das einzufügende Format für date angeben kann, doch finde ich nichts in der Doku und auch Google verrät nichts in der Hinsicht.
    Das Input-Format ist PostgreSQL reichlich egal. Alles, was halbwegs nach einem (gültigen) Timestamp ausschaut, wird akzeptiert.

    Näheres findest du in der Dokumentation:
    PostgreSQL: Documentation: Manuals: PostgreSQL 8.4: Date/Time Types

    Intern werden die unterschiedlichen Formate dann alle in ein einheitliches umgewandelt.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  4. #4
    drooper ist offline Benutzer
    Registriert seit
    05.08.2009
    Beiträge
    81

    Standard

    Per Insert sollten die Daten rein. Nutze dafür das perlskript vom ora2pg Paket.
    Das Format des Quellsystems ist: '200312012305123215' und da würde ich gerne irgendwie bei der Spaltendefinition angeben, was was ist. So geht es jedenfalls nicht. Über to_timestamp funktioniert die Formatanpassung.

    mfg
    Marcus

  5. #5
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von drooper Beitrag anzeigen
    Per Insert sollten die Daten rein. Nutze dafür das perlskript vom ora2pg Paket.
    Das Format des Quellsystems ist: '200312012305123215' und da würde ich gerne irgendwie bei der Spaltendefinition angeben, was was ist. So geht es jedenfalls nicht. Über to_timestamp funktioniert die Formatanpassung.

    mfg
    Marcus
    Tja, da wirst Du wohl to_timestamp nehmen müssen. Was für ein Formatstring verwendest Du dann eigentlich? Ich müßte ja nun auch raten, was da was ist.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  6. #6
    drooper ist offline Benutzer
    Registriert seit
    05.08.2009
    Beiträge
    81

    Standard

    '200312012305123215' nach 2003-12-01 23:05:12.3215 nach Postgres

    Du meinst to_timestamp in einem Insert Trigger?

    mfg
    Marcus

  7. #7
    akretschmer ist offline Super-Moderator
    Registriert seit
    29.10.2006
    Ort
    Nähe Dresden
    Beiträge
    5.337

    Standard

    Zitat Zitat von drooper Beitrag anzeigen
    '200312012305123215' nach 2003-12-01 23:05:12.3215 nach Postgres

    Du meinst to_timestamp in einem Insert Trigger?

    mfg
    Marcus
    Wird wohl mit einem Trigger gar nicht gehen, weil der schon vorher über den kapotten Typ meckert. Kannst Du nicht vorher schon den Dump, den Du da reinziehen willst, bearbeiten? Dies dürfte am schnellsten sein. Ansonsten vielleicht über eine Zwischentabelle und aus der via insert into ... select ... arbeiten.

    Andreas
    --
    ads Das hatte dir akretschmer gestern schon gesagt und siehe da sobald du das machst, funktioniert es ;-)
    https://www.xing.com/profile/Andreas_Kretschmer7

  8. #8
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    Zitat Zitat von akretschmer Beitrag anzeigen
    Wird wohl mit einem Trigger gar nicht gehen, weil der schon vorher über den kapotten Typ meckert.

    Andreas
    oder in die PG-table in die er importiert einfach eine column einfuegen, die da z.Bleistift
    Code:
    karpottes_timestamp varchar(20), ...
    heisst.

    in dem BEFORE INSERT trigger (row-level) kann er dann in aller ruhe seinen
    Code:
    NEW.schoener_timestamp = to_timestamp(NEW.karpottes_timestamp);
    berechnen

    und hernach ggf. die spalte karpottes_timestamp einfach wieder droppen

    natuerlich muss er im INSERT statement den karpotten timestamp (text) auch in karpottes_timestamp fuellen - und den schoenen timestamp leer lassen - oder falls not null einfach mit DEFAULT initialisieren .. der trigger wirds schon richten ..

    oder bei (BULK) COPY auch das richtige falsche feld befuellen ..

    jenachdem was er da gerade verwenden tut
    Geändert von symbiont (29.09.2009 um 17:21 Uhr)

  9. #9
    ads
    ads ist offline Super-Moderator
    Registriert seit
    08.02.2006
    Ort
    MD
    Beiträge
    4.020

    Standard

    Man könnte natürlich die Tabelle zuerst mal mit VARCHAR erstellen und dann den Datentyp nachträglich ändern. Beim Konvertieren kann man dann eine Funktion angeben, die die Arbeit erledigt.
    Xandrian: Kurz gesagt: Du hast ein falsches Konzept und willst nicht auf ads hören

    Jetzt NEU: PostgreSQL - Datenbankpraxis für Anwender, Administratoren und Entwickler

    PostgreSQL Service & Support

  10. #10
    symbiont ist offline Erfahrener Benutzer
    Registriert seit
    17.03.2008
    Ort
    NULL
    Beiträge
    1.320

    Standard

    oder so .. das ist aber nicht so aufregend

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Links: Tobias Bauer - IT- und Funkdienstleistungen   -   Bilderrahmen-kaufen.de - Der Onlineshop für Bilderrahmen & Fotorahmen   -   Funkforum