Перенос столбцов Oracle DATE в TIMESTAMP с часовым поясом

Bakground: У меня есть устаревшее приложение, над которым я работаю, который использует типы DATE для большей части времени хранения в базе данных. Я хотел бы попробовать обновить некоторые из этих таблиц, чтобы они могли использовать часовые пояса, поскольку это создает проблемы с пользователями в разных областях, где находится db (см. Ниже). Это для Oracle 10g.

Quetions:

1) Могу ли я перенести это "на место". То есть я могу так конвертировать

DATE_COL = type:DATE   =>    DATE_COL = type:TIMESTAMP

... или мне нужно будет использовать другое имя столбца?

Имейте в виду, что данные необходимо сохранить. Если это можно сделать полу-легко в миграции script, это будет работать для моих целей.

2) Будет ли этот тип преобразования обратно совместим? Вероятно, у нас есть некоторые сценарии или отчеты, которые попадут в эту таблицу, о которых мы, возможно, и не знаем. Возможно, мы справимся с этим, но я хотел бы знать, в какое гнездо шершней я иду.

3) Какие подводные камни я должен искать?

Спасибо,

EDIT:
(частично в ответ на Гэри)

Я в порядке с многоступенчатым процессом.

1) переместите данные в новый столбец Timestamp (caled TEMP) с каким-то преобразованием 2) отбросить старый столбец (назовем его MY_DATE) 3) создайте новый столбец временной отметки со старым именем столбца даты (MY_DATE) 4) переместите данные в столбец MY_DATE 5) падение столбца TEMP

Гари также хотел получить разъяснения по конкретному вопросу о часовом поясе. Я скопировал свой ответ снизу, чтобы сделать его более читаемым.

В основном данные будут доступны из нескольких разных областей. Мы должны иметь возможность конвертировать в/из локального часового пояса по мере необходимости. У нас также есть триггеры, которые используют sysdate, еще более усложняющие ситуацию. временная отметка с часовым поясом облегчает большую часть этой боли.

О, спасибо за ответы до сих пор.

Ответ 1

Вы можете просто запустить:

ALTER TABLE your_table MODIFY your_date_column TIMESTAMP WITH TIME ZONE;

Но я бы рекомендовал добавить столбец TIMESTAMP в таблицу, используя инструкцию UPDATE для заполнения, и удалите исходный столбец даты, если вы так решите:

ALTER TABLE your_table ADD date_as_timestamp TIMESTAMP WITH TIME ZONE;

UPDATE your_table
   SET date_as_timestamp = CAST(date_column AS TIMESTAMP WITH TIME ZONE);

Преобразование обратно совместимо - вы можете переключаться туда и обратно по своему усмотрению.

Ответ 2

Достаточно просто, чтобы продемонстрировать

SQL>  create table x (y date);
Table created.
SQL> insert into x select sysdate from dual;
1 row created.
SQL> commit;
Commit complete.
SQL> alter table x modify y timestamp;
Table altered.
SQL> select * from x;

Y
---------------------------------------------------------------------------
03/NOV/09 12:49:03.000000 PM
SQL> alter table x modify y date;
Table altered.
SQL> select * from x;
Y
---------
03/NOV/09
SQL> alter table x modify y timestamp with time zone;
alter table x modify y timestamp with time zone
ERROR at line 1:
ORA-01439: column to be modified must be empty to change datatype
SQL> alter table x modify y timestamp with local time zone;
Table altered.
SQL> alter table x modify y date;
Table altered.

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

", вызывающий проблемы с пользователями в разных областях, от которых находится db. Может быть, немного более конкретным. Достаточно ли преобразовать даты (или временные метки) из часового пояса базы данных в пользовательский часовой пояс при вставке/изменении/запросе, или вам действительно нужно упорствовать в том, что запись была создана в 15:00 в определенном часовом поясе.