PostgreSQL中date的数据类型

ergxz8rk  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(149)

我从Excel中导出了一个CSV文件,其日期格式为ddmmyyyy hmm。我使用COPY函数导入到PostgreSQL中的一个表中。
因为我只想保留日期部分,所以我尝试了**date**数据类型:

CREATE TABLE Public."ride_details"(ride_id int,created_at date)

COPY Public."ride_details" FROM '/tmp/ride_details.csv' DELIMITER ',' csv HEADER;

字符串
但这导致了:
错误:日期/时间字段值超出范围:“26/07/19 5:48”
提示:您可能需要一个不同的“日期样式”设置。
CONTEXT:COPY ride_details,line 2,column created_at:“26/07/19 5:48”
SQL状态:
我是否需要指定不同的数据类型或如何使其工作?

iqih9akk

iqih9akk1#

COPY对于无效输入是相当不宽容的。(这样它可以快速可靠。)
它***可能***足以设置匹配的datestyle设置:

SET datestyle = 'ISO,DMY';  -- DMY being the relevant part

字符串
.并重试。(仅为您的会话设置设置。)相关信息:

  • 使用psql \copy导入时间戳格式为“dd.mm.yyyy hh.mm.ss“的CSV

您的问题中的信息不完全清楚,您可能需要做更多工作:
使用to_date()复制到一个临时的“staging”表中,然后使用to_date()INSERT复制到实际的目标表中-使用自定义模式指定您的非标准日期格式:

CREATE TABLE public.ride_details(ride_id int,created_at date);  -- target table

CREATE TABLE pg_temp.step1(ride_id int, created_at text);  -- temp staging table

COPY TO pg_temp.step1 ...;

INSERT INTO public.ride_details(ride_id, created_at)
SELECT ride_id, to_date(created_at, 'DD/MM/YY')  -- or whatever
FROM   pg_temp.step1;


to_date()忽略给定模式后的悬空字符,所以我们不必处理奇怪的hmm规范(hh?)。
我使用了错误消息中显示的YY,而不是你在顶部声称的yyyy。无论哪种方式,输入必须是 * 一致的 * 格式,或者你需要做更多的工作,然而...
所有这些都在单个DB会话中完成,因为这是临时表的作用域。临时表没有持久化,并且在会话结束时自动死亡。我使用它是出于性能原因。
否则,您需要一个普通表作为垫脚石,它在会话之间持久化,并且可以在完成其目的后删除。
相关:

  • 如何使用psql \copy元命令忽略错误
  • 如何在Postgres中使用CSV文件中的值更新选定的行?

相关问题