2016-08-02 69 views
2

我使用的Postgres 9.5.3(在Ubuntu 16.04)和我有一些timestamptz字段Postgres的:錯誤使用時COPY從CSV與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文件的行例如:

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) 

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; 

但在運行第二個命令時,我遇到以下錯誤

有沒有缺失的步驟或錯誤的配置?

任何建議表示讚賞!

+0

'/ tmp/aa.csv'中的行看起來像什麼...... – donkopotamus

+0

@donkopotamus已編輯;) –

+0

只是懷疑:將'2016-08-06 00:00:00 + 07'更改爲'2016- 08-06 00:00:00.000 + 07',然後再運行一次。 –

回答

1

您看到的錯誤意味着Postgres正在嘗試(和失敗)將字符串'datetime_received'轉換爲時間戳值。

發生這種情況的原因是COPY試圖將標題行插入到表中。您需要在COPY FROM命令中包含HEADER子句,就像您爲COPY TO所做的那樣。

更一般地,當使用COPY移動數據時,應確保TOFROM命令使用的是完全相同的選項。如果您的客戶端編碼不是UTF8,則爲一個命令指定ENCODING而不指向另一個命令可能導致錯誤或無聲地破壞數據。

相關問題