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?
我已经从 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?