2016-07-10 10 views
0

Ich habe etwa 32 Millionen Tupeln von Daten des Formats:Umgang mit seltsam formatierten Zeitstempel in Postgres?

2012-02-22T16: 46: 28,9670320 + 00: 00

I wurde gesagt, dass die +00:00 zeigt eine Zeitzone hour:minute Offset, aber auch, dass Postgres nur Stunden-Offset (auch in Dezimalzahlen), nicht die Minute einnimmt. Würde ich also die Daten verarbeiten müssen, um die letzten :00 aus jedem Tupel zu entfernen und die Daten als Zeitstempel einzulesen? Ich möchte die Vorverarbeitung der Datendatei vermeiden, aber wenn Postgres die Werte nicht akzeptiert, werde ich das tun.

Darüber hinaus beträgt die in den angegebenen Daten angegebene Genauigkeit 7 Dezimalstellen im Sekundenabschnitt, während der Postgres-Zeitstempel-Datentyp maximal 6 Dezimalstellen (Millisekunden) zulässt. Müsste ich die Dezimalstellengenauigkeit von 7 auf 6 ändern, damit Postgres die Datensätze lesen kann, oder wird Postgres die 7 automatisch in 7 umwandeln, wenn die Tupel gelesen werden?

+0

Wie werden Sie Ihre Datendatei in Postgres pushen? Ich erwarte, dass Sie sicherstellen müssen, dass die Formatierung korrekt ist, wenn Sie nur die Datendatei laden möchten. Wenn Sie eine Art von Skript verwenden, um die Datenbankschreibvorgänge zu behandeln, sollte das Skript geschrieben werden, um die Daten auch in das erforderliche Format zu konvertieren. Eine typenbewusste Schnittstelle (wie Overkill) wie SQLAlchemy kann auch komplexere Konvertierungen durchführen. –

+0

Ich versuche, kopieren (Tabelle) aus dem Programm (Schnittfelder, Datei). Ich habe gesehen, dass dies möglich ist: 'pgsql = # SELECT '2016-07-10 20: 12: 21.8372949999 + 02: 30' :: Zeitstempel mit Zeitzone AS ts; ts ------------------------------- 2016-07-10 17: 42: 21.837295 + 00 (1 Zeile) ' so scheint es, dass Postgres diese Fälle automatisch konvertiert, also wenn es hier tut, ich glaube, es sollte auch die Tupel konvertieren, wenn sie aus der Datei lesen. – Ben

Antwort

0

pgsql=# SELECT '2016-07-10 20:12:21.8372949999+02:30'::timestamp with time zone AS ts;

ts------------------------------- 2016-07-10 17:42:21.837295+00 (1 row)

Es scheint, dass sie ordnungsgemäß verwendet, wenn verarbeitet zumindest in PostgreSQL 9.4 und höher (vielleicht früher), Minuten Zonenversatz Handhabung nicht dokumentiert ist, aber nicht bekommen. Wenn ich versuche, einen Zeitstempel einzulesen, der in den Sekunden eine Genauigkeit von 7 Dezimalstellen hat, wird er dies automatisch in eine Genauigkeit von 6 Dezimalstellen (Mikrosekunden) umwandeln.

+0

Haben Sie untersucht, was PostgreSQL macht, wenn der Offset der Zeitzone Minuten ungleich Null hat - etwa +05: 30 (Indien) oder +05: 45 (Nepal) oder -03: 30 (Neufundland)? –

+0

Yeah siehe meinen Kommentar auf Chintalagiri Shashank antworten – Ben

+0

Es wäre wahrscheinlich besser, wenn die Informationen aus einem Kommentar heraus wären, entweder in Ihre Antwort oder in Ihre Frage. Ein Hauptgrund dafür ist, dass Sie die Informationen so formatieren können, dass sie leichter lesbar sind. Aber Sie haben Recht - Sie scheinen den Punkt abgedeckt zu haben. (Gibt es eine Region der Welt, die +02: 30 als Zeitzonen-Offset verwendet?) –