postgresql 将日期样式从.csv导入Postgres表

n6lpvg4x  于 2023-02-15  发布在  PostgreSQL
关注(0)|答案(1)|浏览(284)

我创建了一个如下所示的表:

CREATE TABLE TB
(
    .......
    ADMIT_DATE DATE NOT NULL,
    ......
);

使用ADMIT_DATE作为我的日期列。我想从包含ADMIT_DATE表的日期的csv文件导入数据集,格式为"10032006",即2006年3月10日。当我尝试使用以下命令将csv加载到表中时

COPY testing.TB(..., ADMIT_DATE, ...) 
FROM '\filename.csv' 
DELIMITER ',' CSV HEADER;

我得到一个错误,并建议使用不同的datestyle:
错误:日期/时间字段值超出范围:“一○二三○六”
提示:也许你需要一个不同的"datestyle"设置。
如有任何帮助,不胜感激。
我试过用这个但是没用。

CREATE TABLE TB
(
    ... 
    ADMIT_DATE DATE "DDMMYYY"
    ... 
)
q5iwbnjs

q5iwbnjs1#

在处理非标准格式的情况下,最好先将文件导入到临时表(例如,将所有或仅将不可导入的列设置为text类型),然后将数据移动到最终表或就地修改临时表,并在此过程中应用必要的转换。
在您的示例中,需要通过to_timestamp()to_date()函数运行ADMIT_DATE列,这两个函数都允许您定义一个掩码,指示db如何解释文本表示:online demo

CREATE TABLE testing.staging_tb(... text, ADMIT_DATE text, ... text);

COPY testing.staging_tb(..., ADMIT_DATE, ...) 
    FROM '\filename.csv' 
    DELIMITER ',' CSV HEADER;

ALTER TABLE testing.staging_tb
    ALTER COLUMN ADMIT_DATE
    TYPE date
    USING (to_timestamp(ADMIT_DATE,'DDMMYYYY'));

如果您无法承受文件的两个以上的副本,一个在原始位置,一个在数据库中,您可以求助于file_fdw,并从select应用您的更改。

相关问题