Oracle数据库时间戳到时区的时间戳

时间:2016-08-09 07:08:23

标签: oracle oracle11g

需要帮助将时间戳中的数据插入带有区域的时间戳。

create table foo ( tswtz TIMESTAMP WITH TIME ZONE);

SQL:>insert into foo values(systimestamp)

TSWTZ                                 
---------------------------------------
09-08-16 11:39:21.199780000 AM +05:30 

create table foo1 (test_dt timestamp)

insert into foo1 values(systimestamp)
TEST_DT                        
--------------------------------
09-08-16 11:40:55.242754000 AM 

现在,有一个场景,我需要将foo1的值插入foo。 我使用了以下命令,

insert into foo (TSWTZ)  (select CAST(TEST_DT AS TIMESTAMP WITH TIME ZONE)  from foo1)

选择值显示为

09-08-16 11:40:55.242754000 AM ASIA/CALCUTTA

但它应该显示为

09-08-16 11:40:55.242754000 AM +05:30.

如果没有alter命令,你能帮我解决一下这个问题吗?

2 个答案:

答案 0 :(得分:0)

您需要更改NLS参数才能获得结果。请阅读oracle文档以及[https://docs.oracle.com/cd/B19306_01/server.102/b14225/ch4datetime.htm][1]

尝试设置:

 NLS_TIMESTAMP_TZ_FORMAT = DD-MON-RR HH.MI.SSXFF AM TZR
and NLS_TIMESTAMP_FORMAT = DD-MON-RR HH.MI.SSXFF AM
and NLS_TIME_TZ_FORMAT = HH.MI.SSXFF AM TZR
and NLS_TIME_FORMAT =   HH.MI.SSXFF AM

答案 1 :(得分:0)

函数SYSTIMESTAMP返回数据库服务器操作系统的时区当前时间,例如+05:30

当您从TIMESTAMP(没有任何时区信息)投射到TIMESTAMP WITH TIME ZONE时,Oracle将使用您的SESSIONTIMEZONE - 除非您明确指定时区。

显然,在您的情况下,SESSIONTIMEZONE设置为Asia/Calcutta

为了获得理想的结果,你可以做到

ALTER SESSION SET TIME_ZONE = '+05:30';

SELECT CAST((TEST_DT AT TIME ZONE '+05:30') AS TIMESTAMP WITH TIME ZONE) 
FROM ...

注意,时区Asia/Calcutta+05:30不同,但偏移量相同。像Asia/Calcutta这样的地区名称考虑夏令时(不适用于亚洲/加尔各答),+05:30等UTC偏移不考虑夏令时。