2016-08-02 2 views
2

Ich bin mit Postgres 9.5.3 (auf Ubuntu 16.04) und ich habe eine Tabelle mit einigen timestamptz FeldernPostgres: Fehler, wenn sie aus einer CSV mit timestamptz Typ mit COPY

... 
datetime_received timestamptz NULL, 
datetime_manufactured timestamptz NULL, 
... 

ich den folgenden SQL-Befehl verwendet CSV-Datei erzeugen:

COPY (select * from tmp_table limit 100000) TO '/tmp/aa.csv' DELIMITER ';' CSV HEADER; 

und gebraucht:

COPY tmp_table FROM '/tmp/aa.csv' DELIMITER ';' CSV ENCODING 'UTF-8'; 

in die Tabelle zu importieren.

Das Beispiel der Zeilen in der CSV-Datei:

CM0030;;INV_AVAILABLE;2016-07-30 14:50:42.141+07;;2016-08-06 00:00:000+07;FAHCM00001;;123;;;;;1.000000;1.000000;;;;;;;;80000.000000;;;2016-07-30 14:59:08.959+07;2016-07-30 14:59:08.959+07;2016-07-30 14:59:08.959+07;2016-07-30 14:59:08.959+07; 

Aber ich begegne den folgenden Fehler, wenn der zweite Befehl ausgeführt wird:

ERROR: invalid input syntax for type timestamp with time zone: "datetime_received" 
CONTEXT: COPY inventory_item, line 1, column datetime_received: "datetime_received" 

Zeitzone Mein-Datenbank ist:

show timezone; 
TimeZone 
----------- 
localtime(GMT+7) 
(1 row) 

Gibt es einen fehlenden Schritt oder eine falsche Konfiguration?

Alle Vorschläge sind willkommen!

+0

Wie sehen Zeilen in '/ tmp/aa.csv' aus? – donkopotamus

+0

@donkopotamus Bearbeitet;) –

+0

Nur ein Verdacht: Änderung' 2016-08-06 00: 00: 00 + 07' bis '2016- 08-06 00: 00: 00.000 + 07' in dieser Zeile und lass es bitte nochmal laufen. –

Antwort

1

Der angezeigte Fehler bedeutet, dass Postgres versucht (und fehlgeschlagen), die Zeichenfolge 'datetime_received' in einen Zeitmarkenwert zu konvertieren.

Dies passiert, weil COPY versucht, die Kopfzeile in Ihre Tabelle einzufügen. Sie müssen eine HEADER Klausel in den Befehl COPY FROM einfügen, genau wie Sie es für die COPY TO getan haben.

Allgemeiner, wenn Sie COPY verwenden, um Daten zu verschieben, sollten Sie sicherstellen, dass die TO und FROM Befehle genau die gleichen Optionen verwenden. Die Angabe von ENCODING für einen Befehl und nicht für den anderen kann zu Fehlern führen oder Daten im Hintergrund beschädigen, wenn Ihre Clientcodierung nicht UTF8 ist.

Verwandte Themen