如何在没有几秒钟的情况下将时间戳导入到POSTGRES中?来自大型CSV



请原谅新手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 '\locationWeathergrids.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可以处理这个问题。我无法修改该系统,因此仍然需要处理此问题。

编辑2:根据这里的文档,我已经能够使用以下方法将示例 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 的输入中执行此操作,或者如何创建一个临时表,然后创建一个适当的表并在途中进行投射。

创建一个临时列(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;

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

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

最新更新