请原谅新手 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 的输入中执行此操作,或者如何创建临时表,然后创建一个适当的表并在途中进行转换。
datestyle
设置为
ISO, DMY
或类似设置。这里重要的部分是
ISO
,因为您的时间戳(几乎)是 ISO 格式。
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;
SET datestyle TO iso, YMD;
然后,运行 csv 命令:
\copy test_table from 'path-to/data-table.csv' WITH DELIMITER ',' CSV HEADER;