我正在尝试将oracle假脱机的数据复制到csv格式的PostgreSQL。 复制时出现错误提示。
错误:时间戳类型的输入语法无效:“ 20-MAR-17 08.30.41.453267 AM”
我试图在Postgres的DMY
中设置日期时间,但是它不起作用。如果将其转换为YMD
格式,则可以输入数据(即,我必须更改许多字段和将近50 TB的数据)
有人可以帮我吗?
badmin=# copy downloaded_file from '/export/home/dbadmin/postgresql/TESTPGDB/scripts/FACTSET_IDS_2_V1.DOWNLOADED_FILE.csv'
with delimiter ',';
ERROR: invalid input syntax for type timestamp:
"20-MAR-17 08.30.41.453267 AM" CONTEXT: COPY downloaded_file, line 1,
column DOWNLOAD_TIME: "20-MAR-17 08.30.41.453267 AM"
答案 0 :(得分:0)
假设您的主表具有以下列和数据类型。
\d downloaded_file
Column | Type
--------+----------------------------
id | integer
txt | text
tstamp | timestamp without time zone
现在,不要直接复制到表中,而是创建具有相同列但具有所有文本数据类型的临时表。
create temporary table downloaded_file_tmp ( id text, txt text, tstamp text);
现在,将文件内容复制到此临时表中。
文件看起来像这样。
$cat f.csv
1,'TEXT1','20-MAR-17 08.30.41.453267 AM'
从文件复制到临时表。
\copy downloaded_file_tmp from 'f.csv' with delimiter ',' CSV;
从临时表复制到主表。
INSERT INTO downloaded_file
(id,
txt,
tstamp)
SELECT id :: INT,
txt,
TO_TIMESTAMP('20-MAR-17 08.30.41.453267 AM', 'dd-mon-yy hh.mi.ss.US AM')
FROM downloaded_file_tmp;
请注意代表微秒的format specifier US
(000000-999999)
knayak=# select * from downloaded_file;
id | txt | tstamp
----+---------+----------------------------
1 | 'TEXT1' | 2017-03-20 08:30:41.453267