使用psql \ copy导入带有时间戳列(.dd.mm.yyyy hh.mm.ss)的.csv

时间:2012-12-26 15:14:30

标签: postgresql csv timestamp psql postgresql-9.2

我正在尝试使用psql \COPY命令(而不是SQL COPY)将.csv文件中的数据导入到postgresql 9.2数据库中。

输入.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'

我收到此错误:

  

错误:日期/时间字段值超出范围:“16.11.2012 07:10:06”

     

提示:也许你需要一个不同的“约会风格”设置。

     

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

日期风格有什么问题?

3 个答案:

答案 0 :(得分:8)

您是否尝试过设置datestyle setting of the server

SET datestyle = 'ISO,DMY';

您正在使用psql元命令\copy,这意味着输入文件是客户端本地的。但它仍然是服务器必须强制输入匹配数据类型。

更一般地说,与在服务器上调用\copy并与之密切相关的psql元命令COPY不同。我引用the manual concerning \set

  

注意:此命令与SQL命令SET无关。

答案 1 :(得分:3)

我发现很难应用' SET datestyle'应用psql命令时在同一会话中。更改整个数据库/服务器上的日期样式(仅用于导入)也可能会对其他用户或现有应用程序造成副作用。所以我通常在加载之前修改文件:

#!/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' ...."

答案 2 :(得分:0)

您似乎使用的日期样式是德语。 PostgreSQL支持这种日期风格。试试这个:

SET datestyle TO German;