使用不同日期格式从csv复制PostgreSQL

使用不同日期格式从csv复制PostgreSQL,postgresql,psycopg2,Postgresql,Psycopg2,我正在尝试使用COPY FROM STDIN函数将CSV数据上传到Python中的PostgreSQL数据库 在CSV文件中,我的日期字段为DD-MM-YYYY HH:MI,这给了我一个错误: psycopg2.errors.DateTimeFieldDoverFlow:日期/时间字段值超出 范围:“31-12-2020 08:09” 使用“复制自”时,是否有办法定义日期/时间格式 DB列是时间戳类型(如果相关) 我只知道如何使用逐行插入语句来执行此操作。在执行COPY命令之前,请执行以下操作:

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

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

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

使用“复制自”时,是否有办法定义日期/时间格式

DB列是时间戳类型(如果相关)


我只知道如何使用逐行插入语句来执行此操作。

在执行
COPY
命令之前,请执行以下操作:

set datestyle = euro;

show datestyle;
 DateStyle 
-----------
 ISO, DMY
那么这就行了:

SELECT '31-12-2020 08:09'::timestamp;
      timestamp      
---------------------
 2020-12-31 08:09:00
否则,使用我的默认日期样式:

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;


更多信息见表8.15。日期顺序约定

@S-Man道歉,那只是我在脑袋上打出来的。我只是从CSV复制,没有指定日期格式,我会更新以确保正确性。谢谢。您的数据库是否希望使用
2020-12-31
而不是
31-12-2020
?您始终可以将其导入到文本列,然后将其转换为时间戳;-)这是一种选择吗?尽管postgres会毫无问题地发布它:
选择'31-12-2020 08:09'::timestamp
;-)@JimJones是的,我相信PostgreSQL期望的是2020-12-31格式,但我不知道是否可以使用COPY-FROM函数来处理。我假设使用临时文本列仍然比让Python逐行读取文件要高效得多&插入一旦数据进入数据库,解析和转换数据确实要高效得多。你是对的:使用INSERT语句处理大文件会非常低效。谢谢。我创建了临时文本列以获取加载的数据,然后在pgAdmin中使用“UPDATE public.my_table SET actual_datetime_col=(SELECT str_datetime_col::timestamp)”进行更新。在执行
复制之前,只需临时更改会话中的
datestyle
设置即可节省步骤。