Перенос столбцов 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 в определенном часовом поясе.