PostgreSQL 中日期的数据类型

Data type for date in PostgreSQL

我已经从 Excel 中导出了一个 CSV 文件,其日期格式为 ddmmyyyy hmm。我正在使用 COPY 函数导入到 PostgreSQL 中的 table。

因为我只想保留日期部分,所以我尝试了 date 数据类型:

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

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

但这导致:

ERROR: date/time field value out of range: "26/07/19 5:48"
HINT: Perhaps you need a different "datestyle" setting.
CONTEXT: COPY ride_details, line 2, column created_at: "26/07/19 5:48"
SQL state: 22008

我是否需要指定不同的数据类型或如何使其工作?

COPY 对无效输入相当无情。 (这样它可以快速可靠。)

可能足以设置匹配的datestyle设置:

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

...然后重试。 (仅为您的会话设置设置。)相关:

  • Importing .csv with timestamp column (dd.mm.yyyy hh.mm.ss) using psql \copy

你的问题中的信息并不完全清楚,你可能需要做更多的事情:
使用 text 列复制到临时 "staging" table,然后使用 to_date()INSERT 复制到实际目标 table - 使用自定义指定非标准日期格式的模式:

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

CREATE TABLE pg_temp.step1(ride_id int, created_at text); -- temporary 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 格式。无论哪种方式,输入必须是 consistent 格式,否则你需要做更多,但 ...

全部在 单个数据库会话 中,因为那是临时 tables 的范围。 temp table 不会持久化,会在会话结束时自动消失。我出于性能原因使用它。

否则你需要一个简单的 table 作为垫脚石,它在会话中持久存在,并且可以在达到其目的后删除。

相关:

  • How to update selected rows with values from a CSV file in Postgres?