Postgres

时间:2016-01-10 21:54:06

标签: postgresql

我正在使用/ copy命令将数据从文件复制到Postgres中的表,但它会引发错误时区“p.m”。不承认。

运行简单的插入查询也会引发相同的错误

insert into incoming_data_redgold_facts_dictionaries (facts_date_added )values('29/12/2015 3:23:43 P.M.')

如何修改Postgres以便它可以接受给定的时间格式?

2 个答案:

答案 0 :(得分:0)

“最佳”(=可移植)方式是使用ANSI时间戳文字:

insert into incoming_data_redgold_facts_dictionaries 
  (facts_date_added )
values
  (timestamp '2015-12-29 15:23:43');

Postgres还接受直接格式化为ISO时间戳的字符串,而不需要timestamp关键字(如SQL标准那样)

insert into incoming_data_redgold_facts_dictionaries 
  (facts_date_added )
values
  ('2015-12-29 15:23:43');

如果您确实想保留该格式,请使用to_timestamp()功能:

insert into incoming_data_redgold_facts_dictionaries 
  (facts_date_added )
values
  (to_timestamp('29/12/2015 3:23:43 P.M.', 'dd/mm/yyyy hh:mi:ss P.M.'));

手册中的更多细节:

答案 1 :(得分:0)

如果列中的数据不符合PG格式,则基本上有两个选项:

  1. \copy之前解析输入文件以使数据符合要求。如何执行此操作取决于您的文件和可用工具。
  2. 将数据加载到一个表中,该表的列类型将接受您的数据,然后ALTER COLUMN具有适当的转换功能。
  3. 在PG中,第二种选择在这种情况下相当容易。 facts_date_added列应在varchar之前为text\copy类型。将数据导入表后,您可以使用适当的数据转换函数更改列类型:

    ALTER TABLE incoming_data_redgold_facts_dictionaries
      ALTER COLUMN facts_date_added
      SET DATA TYPE timestamp USING to_timestamp(facts_date_added, 'DD/MM/YYYY HH:MI:SS P.M.');