错误:时间戳记类型的输入语法无效:“ 20-MAR-17 08.30.41.453267 AM”

时间:2019-05-31 02:07:14

标签: postgresql

我正在尝试将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"

1 个答案:

答案 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