【问题标题】:PostgreSQL COPY FROM csv with different date format具有不同日期格式的 PostgreSQL COPY FROM csv
【发布时间】:2021-05-25 20:58:04
【问题描述】:

我正在尝试使用 COPY FROM STDIN 函数将 CSV 数据上传到 Python 中的 PostgreSQL 数据库。

在 CSV 文件中,我的日期字段是 DD-MM-YYYY HH:MI,这给了我一个错误:

psycopg2.errors.DatetimeFieldOverflow:日期/时间字段值超出 范围:“31-12-2020 08:09”

有没有办法在使用 COPY FROM 时定义日期/时间格式?

如果相关,DB 列是类型 TIMESTAMP。

我只知道如何使用逐行 INSERT 语句来做到这一点。

【问题讨论】:

  • @S-Man 道歉,这只是我在脑海中打字。我只是从没有指定日期格式的 CSV 复制,我会更新以确保正确性。谢谢。
  • 可能是您的数据库期待2020-12-31 而不是31-12-2020?您始终可以将其导入文本列并在之后将其转换为时间戳 ;-) 它是一个选项吗?虽然 postgres 会毫无问题地投射它:SELECT '31-12-2020 08:09'::timestamp ;-)
  • @JimJones 是的,我相信 PostgreSQL 期待 2020-12-31 格式,但我不知道这是否可以使用 COPY FROM 函数进行操作。我认为使用临时文本列仍然比让 Python 执行逐行文件读取和插入效率更高
  • 一旦数据进入数据库,解析和转换数据确实效率更高。你是对的:对大文件使用 INSERT 语句会非常低效。

标签: postgresql psycopg2


【解决方案1】:

就在COPY 命令之前:

set datestyle = euro;

show datestyle;
 DateStyle 
-----------
 ISO, DMY

然后这个工作:

SELECT '31-12-2020 08:09'::timestamp;
      timestamp      
---------------------
 2020-12-31 08:09:00

否则我的默认datestyle

show datestyle;
 DateStyle 
-----------
 ISO, MDY

SELECT '31-12-2020 08:09'::timestamp;
ERROR:  date/time field value out of range: "31-12-2020 08:09"
LINE 1: SELECT '31-12-2020 08:09'::timestamp;

有关更多信息,请参阅此处Date input 表 8.15。日期顺序约定

【讨论】:

  • 谢谢。我创建了临时文本列来加载数据,然后在 pgAdmin 中我使用“UPDATE public.my_table SET actual_datetime_col=(SELECT str_datetime_col::timestamp)”进行更新。
  • 在执行COPY 之前,您可以通过临时更改会话中的datestyle 设置来节省一步。
猜你喜欢
  • 2019-09-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-15
相关资源
最近更新 更多