如何在没有秒的情况下将 TIMESTAMP 导入到 POSTGRES 中?来自大型 CSV

问题描述 投票:0回答:4

请原谅新手 POSTGRES 问题,我对 MSMSQL 更熟悉一些,但我可能也会在那里遇到困难。

我有一个 CSV,其中包含大约 1200 万行,我正在尝试导入。其中一个字段是格式为 “YYYY-MM-DD HH:MM” 的日期字段。

我的表的字段类型设置为 TIMESTAMP(这是对的吗?)。 CSV 导入失败,提示“错误:日期/时间字段值超出范围:“2019-20-09 04:00””

如何导入这种类型的日期字符串?

我目前的陈述如下:

CREATE TABLE WoSWeatherGrids ( id serial NOT NULL, Location NUMERIC(6), Date TIMESTAMP, ) COPY WosWeatherGrids(Location,Date) FROM '\\location\Weathergrids.csv' DELIMITER ',' CSV HEADER;

收到的错误是:

ERROR: date/time field value out of range: "2019-20-09 04:00" HINT: Perhaps you need a different "datestyle" setting. CONTEXT: COPY wosweathergrids, line 2, column date: "2019-20-09 04:00" SQL state: 22008

我无法更改 CSV 中的字符串,因为这是一个从另一个软件的输出自动运行的过程,希望每天会发生几次。我希望有一个简单的方法可以突出显示以允许我导入此字符串类型。

CSV 样本类型

Location,Date 1075,2019-20-09 04:00 1075,2019-20-09 05:00 1075,2019-20-09 06:00 1075,2019-20-09 07:00

编辑: 这个问题似乎源于 Postgres 不喜欢 YDM DateStyle 格式这一事实。原始系统之一使用 MS SQL,T-SQL 可以处理它。我无法修改该系统,所以仍然需要处理这个问题。

EDIT2:根据文档here我已经能够使用以下命令将示例 YYYY-DD-MM HH:SS 日期类型转换为我需要的日期类型。 select to_char(to_timestamp('2019-20-09 04:00', 'YYYY-DD-MM HH24:MI'), 'HH24:MI DD/MM/YYYY');

。我仍然有些困惑,我需要了解如何从 CSV 的输入中执行此操作,或者如何创建临时表,然后创建一个适当的表并在途中进行转换。 

database postgresql date import timestamp
4个回答
3
投票
您必须将

datestyle

 设置为 
ISO, DMY
 或类似设置。这里重要的部分是 
ISO
,因为您的时间戳(几乎)是 ISO 格式。


2
投票
创建临时列(fec)并在更新日期列后,示例:

CREATE TABLE WoSWeatherGrids ( id serial NOT NULL, Location NUMERIC(6), Date TIMESTAMP, fec text ) COPY WosWeatherGrids(Location,fec) FROM '/tmp/datos.csv' DELIMITER ',' CSV HEADER; update WoSWeatherGrids set date = to_timestamp(fec,'YYYY-DD-MM HH:MI'); alter TABLE WoSWeatherGrids drop COLUMN fec;
    

1
投票
我遇到了同样的问题。我通过打开选项部分中的“标题”来修复它。它可能已将 CSV 文件的第一行解释为数据而不是列标题。


0
投票
在 postgresql shell 内部。第一次运行:

SET datestyle TO iso, YMD;
然后,运行 csv 命令:

\copy test_table from 'path-to/data-table.csv' WITH DELIMITER ',' CSV HEADER;
    
© www.soinside.com 2019 - 2024. All rights reserved.