2012-12-26 9 views
8

Ich versuche, Daten aus einer CSV-Datei in eine Postgresql 9.2-Datenbank mit dem Befehl psql \COPY (nicht die SQL KOPIEREN).Importieren von .csv mit Zeitstempel Spalte (TT.MM.JJJJ hh.mm.ss) mit psql copy

Die Eingabe-CSV-Datei enthält eine Spalte mit einem Zeitstempel im Format TT.MM.JJJJ hh.mm.ss.

Ich habe den Datenbank-Datestyle mit DMY eingestellt.

set datestyle 'ISO,DMY' 

Leider, wenn ich den \COPY Befehl ausführen:

\COPY gc_test.trace(numpoint,easting,northing,altitude,numsats,pdop,timestamp_mes,duration,ttype,h_error,v_error) 
FROM 'C:\data.csv' WITH DELIMITER ';' CSV HEADER ENCODING 'ISO 8859-1' 

ich diesen Fehler:

ERROR: date/time field value out of range: "16.11.2012 07:10:06"

HINT: Perhaps you need a different "datestyle" setting.

CONTEXT: COPY trace, line 2, column timestamp_mes: "16.11.2012 07:10:06"

Was mit dem datestyle ist falsch?

Antwort

7

Haben Sie versucht, die datestyle setting of the server Einstellung?

SET datestyle = 'ISO,DMY'; 

Sie verwenden den psql Metabefehl \copy, die die Eingabedatei bedeutet, ist lokal auf dem Client. Aber es ist immer noch der Server, der die Eingabe zu passenden Datentypen zwingen muss.

Allgemeiner im Gegensatz zu dem psql Metabefehl \copy die COPY auf dem Server aufruft und eng damit verbunden .. Ich zitiere the manual concerning \set:

Note: This command is unrelated to the SQL command SET.

+0

Vielen Dank für Ihre Hilfe. Ich habe die Konfiguration manuell in datestyle = 'iso, dmy' in der Datei postgresql.conf geändert und der Import funktioniert jetzt einwandfrei. Nicht sicher, ob das das ist, was Sie vorschlagen. Ich bin jedoch auf der Suche nach einer Möglichkeit, den Server-Datestyle mit einem psql-Befehl einzustellen. – jatobat

+1

Nun, Postgresql.conf zu modifizieren ist ein radikaler Weg, es zu tun. Sie können auch den SQL-Befehl wie in der Sitzung angegeben ausführen, bevor Sie '\ copy' ausführen. Dann wird die Einstellung nur für diese Sitzung geändert. –

+0

Ich habe versucht, nur den 'set date style =' ISO, DMY '; 'SQL-Befehl im Editor (vor der Änderung der postgresql.conf-Datei) und dann die Ausführung der psql \ copy, aber ich habe den gleichen Fehler wie zuvor. – jatobat

2

Ich fand es schwierig, ‚SET datestyle‘ innerhalb anzuwenden dieselbe Sitzung, wenn Sie den Befehl psql anwenden. Das Ändern des Datumsstils auf der gesamten Datenbank/dem gesamten Server (nur für den Import) kann auch Nebenwirkungen auf andere Benutzer oder bestehende Anwendungen verursachen. So ändere ich normalerweise die Datei selbst vor dem Laden:

#!/bin/bash 
# 
# change from dd.mm.yyyy to yyyy-mm-dd inside the file 
# note: regex searches for date columns separated by semicolon (;) 
sed -i 's/;\([0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9][0-9][0-9]\);/;\3-\2-\1;/g' myfile 
# then import file with date column 
psql <connect_string> -c "\COPY mytable FROM 'myfile' ...." 
0

Der Datumsstil, den Sie zu verwenden scheinen, ist Deutsch. PostgreSQL unterstützt diesen Datumsstil. Versuchen Sie Folgendes:

SET datestyle TO German;