Копирование данных CSV в Postgres со значениями отметок времени Unix

Не совсем понятно, как скопировать CSV-файл, содержащий значения временных меток unix, в Postgres. Например, предположим, что у меня есть файл CSV, который выглядит так:

timestamp, column_1, column_2, column_3
1439935260;"A";"B";"C"
1439935261;"A";"B";"C"
1439935262;"A";"B";"C"

У меня также есть база данных, в которой есть следующие столбцы:

timestamp    | timestamp without time zone | 
column_1     | character varying(40)       | 
column_2     | timestamp without time zone | 
column_3     | timestamp without time zone |

Я ожидал команду

\copy my_table FROM 'my_file.csv' DELIMITER ';' CSV HEADER;

работать, но это не так. Вы получите сообщение об ошибке

ОШИБКА: значение поля даты / времени вне допустимого диапазона: "1439935260"

Как правильно скопировать файлы CSV со значениями временных меток unix в таблицу?


person UndeadKernel    schedule 20.05.2016    source источник
comment
Вы не можете скопировать это напрямую. Сначала вам нужно поместить его в другую таблицу, а затем преобразовать значение unix в правильную метку времени   -  person a_horse_with_no_name    schedule 20.05.2016
comment
если данных не так много - вы можете создать триггер перед вставкой в ​​эту таблицу, функция которого будет выполнять NEW."timestamp" = to_timestamp(NEW."timestamp"), если цель этой таблицы - всегда использоваться для такого COPY импорта   -  person Vao Tsun    schedule 20.05.2016
comment
@VaoTsun: взлом триггера невозможен, поскольку в этом случае запрос отменяется до этапа BEFORE INSERT.   -  person Daniel Vérité    schedule 20.05.2016


Ответы (1)


Ознакомьтесь с моим ответом на Администраторы баз данных,

Я предлагаю

  1. создание типа в таблице abstime, если это новая таблица.
  2. затем, когда вы закончите, выполните оператор ALTER в таблице, чтобы изменить тип.
person Evan Carroll    schedule 13.09.2017