【问题标题】:Postgresql - merge time and date of csv on import to timestampPostgresql - 在导入到时间戳时合并 csv 的时间和日期
【发布时间】:2012-09-23 07:28:30
【问题描述】:

我正在尝试将数据从 csv 文件导入到 postgresql,不幸的是它的格式不完美。

例子:

DATE,TIME,NUMERIC,NUMERIC,NUMERIC,NUMERIC,INTEGER

我想将数据导入到包含列的表中:

timestamp with timezone, numeric, numeric, numeric, numeric, integer

为了导入我使用复制的数据:

COPY tabledata FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;

当然它不起作用,因为日期和时间用“”分隔,所以 postgresql 假定它们是 2 个单独的数据字段。

我已经设法将 .csv 导入到与 .csv 一样设置的表中,但是我需要稍后将日期和时间作为带有时区的时间戳,因为我将处理大量数据由于性能问题,导入后转换将是我的最后选择。

我尝试使用“sed 's/,/ /' EURUSD30.csv > EURUSD30E.csv”在导入之前编辑 .csv 文件,但是我收到一条错误消息,提示输入了命令“'s/”错误或找不到。我很无知,因为这似乎对其他人都有效,但这也不是我的第一选择。

如果 postgresql 可以在导入时简单地被告知将时间和日期合并为一个时间戳值,那就更容易了。有什么想法吗?

谢谢

【问题讨论】:

  • 复制命令没有任何改变数据的能力。如果您希望在导入时执行此操作,您可以尝试向表中添加一个触发器,该触发器将在每行插入和合并列后触发。不幸的是,最后,这在性能方面不会比在导入后执行操作更好。最好的办法是在导入之前清理 CSV 文件。

标签: postgresql date time import timestamp


【解决方案1】:

最好的办法是将COPY 数据写入TEMPORARYUNLOGGED 表,然后从那里执行:

INSERT INTO real_table
SELECT col1, col2, col3, datecol + timecol, col6, ...
FROM temp_copy_table;

您也可以在该过程中进行任何其他所需的数据按摩。

合并时考虑时区。 DATE + TIME 产生一个timestamp without time zone

regress=# SELECT pg_typeof(DATE '2012-02-01' + TIME '10:00');
          pg_typeof          
-----------------------------
 timestamp without time zone
(1 row)

并且您可能想要存储带有时区的时间戳,因此您可能想要告诉 Pg 将日期+时间解释为处于特定时区:

(datecol + timecol) AT TIME ZONE 'UTC'

或任何时间戳的本地时区。

【讨论】:

  • 如果您必须混合来自 csv 的数据和例如现在的时间戳,最好的选择。它还允许您在合并到目标表之前验证临时表中的数据
猜你喜欢
  • 2019-06-29
  • 2014-05-22
  • 2012-01-30
  • 1970-01-01
  • 1970-01-01
  • 2013-03-02
  • 2013-06-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多