2012-12-26 61 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;