我公司最近升级到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时区,因此它不会转换它?
答案 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变量。
截至目前,我几乎可以肯定您的数据库将返回中央的
中的systimestampSELECT SYSTIMESTAMP FROM DUAL;
为了永久修复(就像您在升级到Oracle 11g之前一样),您需要将TZ变量添加或编辑为UTC。例如,如果我想将我的时区更改为亚洲/加尔各答,那么我必须添加/编辑TZ变量,如下所述
TZ='Asia/Calcutta'; EXPORT TZ
编辑.bash_profile后,需要重新启动侦听器服务和数据库。
或者作为替代方案,您可以使用 tbone 建议的to_timestamp()和to_timestamp_tz()函数来解决此问题。
此致 安迪