Postgres:使用时间戳类型

时间:2016-08-02 02:44:25

标签: postgresql

我正在使用Postgres 9.5.3(在Ubuntu 16.04上),我有一个包含一些timestamptz字段的表

...
datetime_received timestamptz NULL,
datetime_manufactured timestamptz NULL,
...

我使用以下SQL命令生成CSV文件:

COPY (select * from tmp_table limit 100000) TO '/tmp/aa.csv' DELIMITER ';' CSV HEADER;

并使用:

COPY tmp_table FROM '/tmp/aa.csv' DELIMITER ';' CSV ENCODING 'UTF-8';

导入表格。

CSV文件中的行示例:

CM0030;;INV_AVAILABLE;2016-07-30 14:50:42.141+07;;2016-08-06 00:00:000+07;FAHCM00001;;123;;;;;1.000000;1.000000;;;;;;;;80000.000000;;;2016-07-30 14:59:08.959+07;2016-07-30 14:59:08.959+07;2016-07-30 14:59:08.959+07;2016-07-30 14:59:08.959+07;

但是在运行第二个命令时遇到以下错误:

ERROR:  invalid input syntax for type timestamp with time zone: "datetime_received"
CONTEXT:  COPY inventory_item, line 1, column datetime_received: "datetime_received"

我的数据库的时区是:

 show timezone;
 TimeZone  
-----------
 localtime(GMT+7)
(1 row)

是否有任何缺失的步骤或错误的配置?

任何建议都表示赞赏!

1 个答案:

答案 0 :(得分:1)

您看到的错误意味着Postgres正在尝试(并且失败)将字符串'datetime_received'转换为时间戳值。

这种情况正在发生,因为COPY正在尝试将标题行插入到表中。您需要在HEADER命令中包含COPY FROM子句,就像您对COPY TO所做的那样。

更一般地说,当使用COPY移动数据时,您应该确保TOFROM命令使用完全相同的选项。如果您的客户端编码不是UTF8,则为一个命令而不是另一个命令指定ENCODING可能会导致错误或无提示损坏数据。