使用timezone将Oracle DATE列迁移到TIMESTAMP

时间:2009-11-03 00:54:21

标签: sql oracle date oracle10g timestamp

Bakground: 我有一个我正在研究的遗留应用程序,它使用DATE类型在数据库中进行大部分时间存储。我想尝试更新其中一些表,以便他们可以利用时区,因为这会导致db所在的不同区域的用户出现问题(请参阅下面的 A )。这适用于Oracle 10g。

Quetions:

1)我可以“就地”进行迁移吗?我可以像这样转换

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

...或者我必须使用不同的列名吗?

请记住,需要保留数据。如果这可以在迁移脚本中轻松完成,则可以用于我的目的。

2)这种类型的转换是否会向后兼容?我们可能会有一些脚本或报告会出现在我们可能不知道的表中。我们可以处理它,但我想知道我正在走进什么样的大黄蜂窝。

3)我应该注意哪些陷阱?

谢谢,

编辑:
(部分是对Gary的回应)

我很好地完成了一个多步骤的过程。

1)通过某种转换将数据移动到新的Timestamp列(caled TEMP) 2)删除旧列(我们称之为MY_DATE) 3)使用旧日期列名称创建新的时间戳列(MY_DATE) 4)将数据移动到MY_DATE列 5)放下TEMP柱

A Gary还希望澄清具体的时区问题。我从下面复制了我的答案,以使其更具可读性。

基本上,数据将从几个不同的区域进行访问。我们需要能够根据需要转换为本地时区/从本地时区转换。我们还有使用sysdate进一步使事情变得复杂的触发器。时区的时间戳减轻了很多痛苦。

哦,谢谢你到目前为止的答案。

2 个答案:

答案 0 :(得分:16)

你可以跑:

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

转换向后兼容 - 您可以切换回&你喜欢的。

答案 1 :(得分:6)

足够简单来演示

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所在的不同区域的用户出现问题”。 可能有助于更具体一点。在插入/更改/查询时,将日期(或时间戳)从数据库时区转换为用户的时区是否足够,或者您是否确实需要保留记录是在特定时区的下午3:00创建的事实。