尝试将日期时间值导入 Postgresql 表时出错

Error trying to import datetime value into a Postgresql table

提问人:Guasqueño 提问时间:8/18/2023 最后编辑:AlbinaGuasqueño 更新时间:8/25/2023 访问量:53

问:

我有一个包含几列的 csv 文件,其日期时间值的格式如下:.我正在尝试使用 DBeaver 中内置的导入功能以及使用 postgresql COPY 语句导入数据。两者都失败了。'2008-12-03-18.01.46.000916'

我在 DBeaver 中使用作为导入格式,但我没有看到一种方法可以告诉 COPY 使用日期时间格式来读取它。我尝试了你在这里看到的,但它不起作用:'yyyy-MM-dd-HH.mm.ss.SSS'DATEFORMAT

COPY myTable FROM '/tmp/myDataWithDotsInTime.csv'
WITH (FORMAT csv, HEADER false, DELIMITER ',',  DATEFORMAT 'yyyy-MM-dd-HH.mm.ss');

Postgresql 函数使用与 DBeaver 不同的格式并且有效,但我找不到告诉 COPY 使用它的方法:to_datetime

SELECT CURRENT_TIMESTAMP, to_timestamp('2008-12-03-18.01.46.000916', 'YYYY-MM-DD-HH24.MI.SS') AS ts
PostgreSQL 日期时间 导入 格式

评论

0赞 Stefanov.sm 8/18/2023
copy作为文本插入到临时表格中,然后从中选择插入。mytable

答:

1赞 Stefanov.sm 8/18/2023 #1

在类似的情况下(需要特定的格式或转换),我使用以下方法,足够通用,通常可以解决问题。

  • 创建一个类似于将时间戳列作为文本的临时表;mytable
  • copy进入临时表;
  • insertinto 替换为 select from temporary table。mytable

假设 中的目标字段是mytablets

create temporary table the_temporary_table (like myTable);
alter table the_temporary_table alter ts type text;

COPY myTable -- Your COPY statement w/o DATEFORMAT 
FROM '/tmp/myDataWithDotsInTime.csv'
WITH
(
 FORMAT csv, 
 HEADER false, 
 DELIMITER ','
);

insert into myTable
 select <..fields before ts..>,
        to_timestamp(ts, 'YYYY-MM-DD-HH24.MI.SS.US') ts,
        <..fields after ts..>
 from the_temporary_table;
0赞 Guasqueño 8/19/2023 #2

我能够通过在最后(在导入设置中)以微秒的格式添加额外的 SSS 来使用 DBeaver,以满足如下输入标准:

yyyy-MM-dd-HH.mm.ss.SSSSSS

感谢 DBeaver 支持人员。

还要感谢 Stefanov.sm 提供与 COPY 语句配合使用的变通解决方案。但是,就我而言,我更喜欢 DBeaver 解决方案,因为我可以从我的 PC 导入我的 CSV 文件,而不必将 CSV 文件复制到 Linux 后端以使用 COPY。