Oracle 11g转换时间戳,假设时间是Cental,当它已经是UTC时

时间:2015-07-16 14:48:26

标签: oracle oracle11g

我公司最近升级到Oracle 11g。我有一个字段 - 带有时区的时间戳,其数据插入为" UTC"。我们查询数据,进行一些更改并运行更新表,更新表中的所有字段。自11g升级以来,update语句会转换日期/时间,假设它是US / Central(我的时间)。示例:

2015年7月4日7:40:04.000000 AM +00:00转入2015年7月4日12:40:04.000000 AM +00:00,更新声明如下:

vagrant up

我尝试过插入一个基本日期,我尝试过使用不同的时区变体。没有任何作用,它总是转换时间戳。

我如何向Oracle表明我更新的时间戳是UTC而不是US / Central时区,因此它不会转换它?

2 个答案:

答案 0 :(得分:0)

尝试使用to_timestamp_tz。例如:

SQL> create table tz_test
(
id number, 
col1 timestamp with time zone
)
Table created.
SQL> insert into tz_test values (1, systimestamp)
1 row created.
SQL> insert into tz_test values (2, to_timestamp('20150716 7:40:04', 'YYYYMMDD HH24:MI:SS'))
1 row created.
SQL> insert into tz_test values (3, to_timestamp_tz('20150716 7:40:04 -0:00', 'YYYYMMDD HH24:MI:SS TZH:TZM'))
1 row created.
SQL> commit
Commit complete.
SQL> select * from tz_test

        ID COL1                               
---------- -----------------------------------
         1 7/16/2015 1:29:47.031650 PM -04:00 
         2 7/16/2015 7:40:04.000000 AM -04:00 
         3 7/16/2015 7:40:04.000000 AM +00:00 

3 rows selected.

我的时区是东部(从UTC开始的-4),但第3次插入我指定了要使用的时区。

答案 1 :(得分:0)

此问题背后的原因是您的.bash_profile中未正确设置TZ变量。

截至目前,我几乎可以肯定您的数据库将返回中央的

中的systimestamp
SELECT SYSTIMESTAMP FROM DUAL;

为了永久修复(就像您在升级到Oracle 11g之前一样),您需要将TZ变量添加或编辑为UTC。例如,如果我想将我的时区更改为亚洲/加尔各答,那么我必须添加/编辑TZ变量,如下所述

TZ='Asia/Calcutta'; EXPORT TZ

编辑.bash_profile后,需要重新启动侦听器服务和数据库。

或者作为替代方案,您可以使用 tbone 建议的to_timestamp()和to_timestamp_tz()函数来解决此问题。

此致 安迪