web-dev-qa-db-ja.com

OracleDATE列をタイムゾーンを使用してTIMESTAMPに移行する

Bakground:データベース内のほとんどの時間ストレージにDATEタイプを使用する、作業中のレガシーアプリがあります。これらのテーブルのいくつかを更新して、タイムゾーンを利用できるようにしたいと思います。これは、データベースがある場所とは異なる領域のユーザーに問題を引き起こしているためです([〜#〜] a [〜#〜]を参照)以下)。これはOracle10g用です。

質問:

1)これを「インプレース」で移行できますか。それは私がそのように変換することができます

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

...または別の列名を使用する必要がありますか?

データを保持する必要があることに注意してください。これが移行スクリプトで半簡単に実行できる場合は、私の目的で機能します。

2)このタイプの変換には下位互換性がありますか?このテーブルにヒットするスクリプトやレポートがいくつかある可能性がありますが、それについては知らない可能性があります。おそらく対処できると思いますが、どのようなスズメバチの巣に足を踏み入れているのか知りたいです。

3)どのような落とし穴に注意する必要がありますか?

ありがとう、

編集:
(一部ゲイリーへの返答)

私は多段階のプロセスで大丈夫です。

1)何らかの変換を使用してデータを新しいタイムスタンプ列(caled TEMP)に移動します2)古い列を削除します(これをMY_DATEと呼びます)3)古い日付列名(MY_DATE)で新しいタイムスタンプ列を作成します4)データを移動しますMY_DATE列に5)TEMP列を削除します

[〜#〜] a [〜#〜]ゲイリーは、特定のタイムゾーンの問題についても説明したいと考えていました。読みやすくするために、以下から回答をコピーしました。

基本的に、データはいくつかの異なる領域からアクセスされます。必要に応じて、ローカルタイムゾーンとの間で変換できる必要があります。 sysdateを使用するトリガーもあり、さらに複雑になります。タイムゾーン付きのタイムスタンプは、この苦痛の多くを軽減します。

ああ、これまでの回答に感謝します。

12
Jason Tholstrup

あなたはただ走ることができます:

ALTER TABLE your_table MODIFY your_date_column TIMESTAMP WITH TIME ZONE;

ただし、UPDATEステートメントを使用してテーブルにTIMESTAMP列を追加し、データを入力し、必要に応じて元の日付列を削除することをお勧めします。

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);

変換には下位互換性があります。必要に応じて前後に切り替えることができます。

16
OMG Ponies

デモンストレーションするのに十分シンプル

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.

したがって、日付からタイムスタンプ(またはローカルタイムゾーンのタイムスタンプ)に移動したり、元に戻ったりすることはできますが、タイムゾーンのタイムスタンプ(つまり、オフセットが保持されている場所)には移動できません。別の列を追加し、既存のデータをコピーする必要があります(適切なタイムゾーンのデフォルトを使用)。

「データベースが存在する場所とは異なる領域のユーザーに問題を引き起こす」。もう少し具体的にするのに役立つかもしれません。挿入/変更/照会時にデータベースのタイムゾーンからユーザーのタイムゾーンに日付(またはタイムスタンプ)を変換するだけで十分ですか、それとも特定のタイムゾーンで午後3時にレコードが作成されたという事実を永続化する必要がありますか?.

6
Gary Myers