Импорт DB2 с измененным форматом метки времени для времени с прикрепленным к нему EDT/EST

У меня есть файл import_file.csv с указанным ниже форматом метки времени.

Oct/21/2013 09:45:01 AM EDT
Dec/04/2013 04:41:01 PM EST

Я создал таблицу в IBM DB2 v9.7

create table table_import_timestamp ( my_timestamp timestamp )

А затем попытался импортировать файл.

db2 import from import_file.csv of del messages msg.out insert into table_import_timestamp

Я попытался использовать несколько модифицированных форматов меток времени, доступных в утилите импорта db2, но не нашел подходящего для импорта меток времени в формате, указанном в файле.

Есть ли способ импортировать этот формат в таблицу без изменения файла и путем указания формата временной метки в моем операторе импорта?


person Abhi    schedule 01.12.2015    source источник
comment
Вы могли бы использовать модификатор timestampformat, если бы не спецификация часового пояса в вашем файле. Временные метки DB2 не содержат информацию о часовом поясе, поэтому ваши данные нельзя импортировать как есть.   -  person mustaccio    schedule 02.12.2015
comment
Спасибо за обновления. Поэтому, если я не могу импортировать данные из файла как есть, смогу ли я, по крайней мере, игнорировать часовой пояс в файле в своем операторе импорта. Я не хочу изменять файл, полученный откуда-то еще. Просто нужно загрузить данные, что требуется.   -  person Abhi    schedule 02.12.2015


Ответы (1)


Если вы хотите потерять информацию о часовом поясе, у вас есть несколько вариантов.

1.Используйте команду INGEST, которая позволяет вам манипулировать входными данными перед вставкой:

ingest from file YOURFILE format delimited ($ts char) restart off
  insert into YOURTABLE (TS_COLUMN) 
  values (
   timestamp_format(left(cast($ts as varchar(30)),23),'Mon/DD/YYYY HH:MI:SS AM')
  )

Вы даже можете добавить в таблицу дополнительный столбец для хранения значения смещения часового пояса, например.

ingest from file YOURFILE format delimited ($ts char) restart off
  insert into YOURTABLE (TS_COLUMN,TZ_COLUMN) 
  values (
   timestamp_format(left(cast($ts as varchar(30)),23),'Mon/DD/YYYY HH:MI:SS AM'),
   case when right(cast($ts as varchar(30)),3) = 'EDT' then -4 else -5 end
  )

Для этого вам потребуется установить версию 10.1 клиента DB2, поскольку INGEST не была доступна в клиенте 9.7. Он по-прежнему будет работать с сервером 9.7.

2. Ослабьте ваше требование «не хочу изменять файл» и используйте что-то вроде sed или perl для переформатирования данных на лету, например.

mkfifo /tmp/mypipe
db2 "import from /tmp/mypipe of del 
modified by timestampformat=\"MMM/DD/YYYY HH:MM:SS TT\" 
insert into YOURTABLE (TS_COLUMN)" &
perl -npe 's/ E(D|S)T(,|$)//' YOURFILE > /tmp/mypipe
rm -f /tmp/mypipe

Используя канал ОС, вы не изменяете исходный файл и не используете дополнительное место на диске.

person mustaccio    schedule 02.12.2015