从CSV导入PostgreSQL数据库时,是否可以将Unix时间戳自动转换为TIMESTAMP列?

问题描述 投票:2回答:1

这基本上是thiss/mysql/postgresql/g的重复。


我创建了一个包含timestamp TIMESTAMP列的表,我正在尝试从具有Unix时间戳行的CSV文件中导入数据。

但是,当我尝试将COPY文件放入表格时,我得到了错误

2:1: conversion failed: "1394755260" to timestamp
3:1: conversion failed: "1394755320" to timestamp
4:1: conversion failed: "1394755800" to timestamp
5:1: conversion failed: "1394755920" to timestamp

显然,如果我将列设置为INT,这是有效的。

在MySQL变体中,我解决了一个伎俩

LOAD DATA LOCAL INFILE 'file.csv'
INTO TABLE raw_data
fields terminated by ','
lines terminated by '\n'
IGNORE 1 LINES
 (@timestamp, other_column)
SET timestamp = FROM_UNIXTIME(@timestamp),
    third_column = 'SomeSpecialValue'
;

请注意两件事:我可以使用函数将CSV文件中的@timestamp变量映射为适当的DATETIME,并且我可以将额外的列设置为特定值(这是必要的,因为我在数据库中有比CSV更多的列)。

我正在切换到postgresql,因为mysql缺少一些函数,这些函数使我需要编写的查询变得更加容易。

有没有办法配置表,以便自动进行转换?

postgresql csv timestamp
1个回答
1
投票

我认为您可以通过按原样导入数据,使用转换后的时间戳创建第二列,然后使用触发器确保插入行的任何时间填充新列来实现此目的:

alter table raw_table
add column time_stamp timestamp;

CREATE OR REPLACE FUNCTION raw_table_insert()
  RETURNS trigger AS
$BODY$
BEGIN
  NEW.time_stamp = timestamp 'epoch' + NEW.unix_time_stamp * interval '1 second';
  return NEW;
END;
$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

CREATE TRIGGER insert_raw_table_trigger
  BEFORE INSERT
  ON raw_table
  FOR EACH ROW
  EXECUTE PROCEDURE raw_table_insert();

如果可以修改时间戳列,那么您还需要确保触发器也适用于更新。

或者,您可以创建一个动态生成时间戳的视图,但优点/缺点取决于您在列上搜索的频率,表格的大小以及您期望的DML大小。

© www.soinside.com 2019 - 2024. All rights reserved.