10

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”

提示:也许您需要不同的“日期样式”设置。

上下文:复制跟踪,第 2 行,列 timestamp_mes:“16.11.2012 07:10:06”

日期样式有什么问题?

4

3 回答 3

11

您是否尝试过设置服务器datestyle的设置

SET datestyle = 'ISO,DMY';

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

\copy更一般地说,与在服务器上调用COPY并与之密切相关的 psql 元命令不同。我引用了有关以下内容的手册\set

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

于 2012-12-26T15:28:26.663 回答
4

我发现在应用 psql 命令时很难在同一个会话中应用 'SET 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' ...."
于 2016-03-05T09:02:37.260 回答
0

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

SET datestyle TO German;
于 2016-04-26T09:50:22.590 回答