需要帮助将时间戳中的数据插入带有区域的时间戳。
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命令,你能帮我解决一下这个问题吗?
答案 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偏移不考虑夏令时。