2012-12-26 9 views
8

Próbuję zaimportować dane z pliku .csv do bazy danych PostgreSQL 9.2 przy użyciu polecenia psql \COPY (nie SQL KOPIUJ).Importowanie .csv z kolumną znacznika czasowego (dd.mm.rrrr hmmmm.ss) przy użyciu psql copy

Plik wejściowy .csv zawiera kolumnę ze znacznikiem czasu w formacie dd.mm.rrrr hh.mm.ss.

Ustawiłem styl danych bazy danych na DMY przy użyciu.

set datestyle 'ISO,DMY' 

Niestety, po uruchomieniu polecenia \COPY:

\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' 

otrzymuję ten błąd:

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"

Co jest nie tak z datestyle?

Odpowiedz

7

Czy próbowałeś ustawić datestyle setting of the server?

SET datestyle = 'ISO,DMY'; 

Używasz meta-psql polecenie \copy, co oznacza, że ​​plik wejściowy jest lokalny dla klienta. Ale to wciąż serwer musi zmusić wejście do dopasowywania typów danych.

Bardziej ogólnie, w przeciwieństwie do psql meta-polecenia \copy który wywołuje COPY na serwerze i jest ściśle związany z nim .. cytuję the manual concerning \set:

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

+0

Dzięki za pomoc. Ręcznie zmodyfikowałem konfigurację na datestyle = 'iso, dmy' w pliku postgresql.conf, a import działa teraz poprawnie. Nie jestem pewien, czy to właśnie sugerujesz. Jednak szukam sposobu na ustawienie datactwa serwera za pomocą komendy psql. – jatobat

+1

Cóż, modyfikowanie pliku postgresql.conf jest jednym z radykalnych sposobów na zrobienie tego. Możesz także wydać komendę SQL w sposób opisany w twojej sesji przed uruchomieniem '\ copy'. To ustawienie zostanie zmienione tylko dla tej sesji. –

+0

Próbowałem po prostu uruchamiać polecenie 'set datestyle = 'ISO, DMY';' SQL w edytorze (przed modyfikacją pliku postgresql.conf), a następnie wykonać psql \ copy, ale dostałem ten sam błąd co poprzednio. – jatobat

2

znalazłem to trudne do zastosowania 'SET' w datestyle ta sama sesja podczas stosowania polecenia psql. Zmiana stylu dat na całej bazie danych/serwerze (tylko w przypadku importu) może również powodować efekty uboczne na innych użytkownikach lub istniejących aplikacjach. Zwykle modyfikuję sam plik przed wczytaniem:

#!/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

Stylem, który wydaje się być używany w języku niemieckim. PostgreSQL obsługuje ten styl daty. Spróbuj użyć tego:

SET datestyle TO German; 
Powiązane problemy