2012-12-26 103 views
8

導入.csv和時間戳列(dd.mm.yyyy hh.mm.ss)我試圖使用psql \COPY命令將數據從.csv文件導入到postgresql 9.2數據庫(而不是SQL複製)。使用psql copy

輸入.csv文件包含一個帶有dd.mm.yyyy hh.mm.ss格式時間戳的列。

我已經使用數據庫日期式設置爲DMY。

set datestyle 'ISO,DMY' 

不幸的是,當我運行\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' 

我得到這個錯誤:

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"

什麼是錯的DATESTYLE?

回答

7

您是否嘗試過設置datestyle setting of the server

SET datestyle = 'ISO,DMY'; 

您正在使用psql元命令\copy,這意味着輸入文件是本地客戶端。但它仍然是服務器必須強制匹配數據類型的輸入。

更一般,不像psql元命令\copy的服務器上調用COPY息息相關吧..我引用the manual concerning \set

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

+0

感謝您的幫助。我在postgresql.conf文件中手動將配置修改爲datestyle ='iso,dmy',現在導入工作正常。不知道這是你的建議。然而,我正在尋找一種使用psql命令設置服務器日期樣式的方法。 – jatobat

+1

那麼,修改postgresql.conf是一種徹底的方法。在運行'\ copy'之前,您也可以按照會話中所述的方式發出SQL命令。然後,該設置僅針對該會話進行更改。 –

+0

我試過在編輯器中運行'set datestyle ='ISO,DMY';'SQL命令(在修改postgresql.conf文件之前),然後執行psql \ copy,但我得到了和以前一樣的錯誤。 – jatobat

2

我發現很難適用「SET DATESTYLE」內應用psql命令時的同一個會話。改變整個數據庫/服務器上的datestyle(僅用於導入)也可能對其他用戶或現有應用程序造成副作用。所以我通常在加載之前修改文件本身:

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

您似乎使用的日期樣式是德語。 PostgreSQL支持這種日期樣式。試試這個:

SET datestyle TO German;