Konvertierung von varchar(16) auf timestamp

Datenbank Migration (z. B. von MySQL auf PostgreSQL)
drooper
Benutzer
Beiträge: 81
Registriert: Mi 5. Aug 2009, 15:57

Konvertierung von varchar(16) auf timestamp

Beitrag von drooper »

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

akretschmer
Erfahrener Benutzer
Beiträge: 7733
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer »

drooper hat geschrieben: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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

ads
Erfahrener Benutzer
Beiträge: 4151
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads »

drooper hat geschrieben: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 Bild

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

PostgreSQL Service & Support

drooper
Benutzer
Beiträge: 81
Registriert: Mi 5. Aug 2009, 15:57

Beitrag von drooper »

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

akretschmer
Erfahrener Benutzer
Beiträge: 7733
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer »

drooper hat geschrieben: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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

drooper
Benutzer
Beiträge: 81
Registriert: Mi 5. Aug 2009, 15:57

Beitrag von drooper »

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

Du meinst to_timestamp in einem Insert Trigger?

mfg
Marcus

akretschmer
Erfahrener Benutzer
Beiträge: 7733
Registriert: So 29. Okt 2006, 13:35
Wohnort: Kaufbach, Sachsen, Germany, Germany
Kontaktdaten:

Beitrag von akretschmer »

drooper hat geschrieben:'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
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services

symbiont
Erfahrener Benutzer
Beiträge: 1328
Registriert: Mo 17. Mär 2008, 11:45
Wohnort: NULL

Beitrag von symbiont »

akretschmer hat geschrieben: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: Alles auswählen

karpottes_timestamp varchar(20), ... 
heisst.

in dem BEFORE INSERT trigger (row-level) kann er dann in aller ruhe seinen

Code: Alles auswählen

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

ads
Erfahrener Benutzer
Beiträge: 4151
Registriert: Mi 8. Feb 2006, 10:58
Wohnort: MD
Kontaktdaten:

Beitrag von ads »

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 Bild

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

PostgreSQL Service & Support

symbiont
Erfahrener Benutzer
Beiträge: 1328
Registriert: Mo 17. Mär 2008, 11:45
Wohnort: NULL

Beitrag von symbiont »

oder so .. das ist aber nicht so aufregend ;)

Antworten