使用timezone将Oracle DATE列迁移到TIMESTAMP

Jas*_*rup 12 sql oracle timestamp date oracle10g

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

Quetions:

1)我可以"就地"迁移这个.我可以像这样转换

DATE_COL = type:DATE   =>    DATE_COL = type:TIMESTAMP
Run Code Online (Sandbox Code Playgroud)

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

请记住,需要保留数据.如果这可以在迁移脚本中轻松完成,那么它将适用于我的目的.

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

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

谢谢,

编辑:(
部分回应加里)

我很好,有一个多步骤的过程.

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

一个加里还希望了解具体的时区的问题予以澄清.我从下面复制了我的答案,以使其更具可读性.

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

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

OMG*_*ies 17

你可以运行:

ALTER TABLE your_table MODIFY your_date_column TIMESTAMP WITH TIME ZONE;
Run Code Online (Sandbox Code Playgroud)

但我建议在表中添加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);
Run Code Online (Sandbox Code Playgroud)

转换是向后兼容的 - 您可以根据需要来回切换.


Gar*_*ers 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.
Run Code Online (Sandbox Code Playgroud)

因此,您可以从日期到时间戳(或带有本地时区的时间戳)再返回,但不能用于带时区的时间戳(即保留偏移量的位置).您必须添加另一列,并复制现有数据(使用适当时区的默认值).

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

  • PS.当您从另一个日期中减去一个日期时,您会得到几天的数字答案.使用时间戳,您将获得INTERVAL数据类型.这是一个需要寻找的陷阱 (2认同)