如何将oracle'时间戳转换为时区' PL / SQL中的变量从一个时区到另一个时区? 变量声明如下:
v_date timestamp with time zone;
此声明返回' -04:00'在我的服务器上:
select dbtimezone from dual;
对于我们的示例,变量中的数据位于EDT' (' -04:00')我希望转换为任意时区,例如“EET' (' +02:00')并将其存储在不同的变量中:
v_date2 timestamp with time zone;
答案 0 :(得分:2)
您可以使用at time zone
从一个时区转换为另一个时区。例如:
set serveroutput on
declare
v_ts1 timestamp with time zone;
v_ts2 timestamp with time zone;
begin
v_ts1 := to_timestamp_tz('2014-10-01 13:00:00 US/Eastern',
'YYYY-MM-DD HH24:MI:SS TZR');
v_ts2 := v_ts1 at time zone 'Europe/Athens';
dbms_output.put_line(v_ts1 || ' => ' ||
to_char(v_ts1, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'));
dbms_output.put_line(v_ts2 || ' => ' ||
to_char(v_ts2, 'YYYY-MM-DD HH24:MI:SS TZH:TZM'));
end;
/
01-OCT-14 13.00.00.000000 US/EASTERN => 2014-10-01 13:00:00 -04:00
01-OCT-14 20.00.00.000000 EUROPE/ATHENS => 2014-10-01 20:00:00 +03:00
您可以使用小时和分钟偏移,但使用区域和区域名称意味着您不必自己考虑夏令时。即使使用EET也会给你一个奇怪的结果,因为它在东欧仍然是夏季(EEST而不是EET),所以当你说你想要+02:00的时候,对于大多数人来说它真的应该是+03:00美国东部在东部时间而不是美国东部时间。 (虽然时钟在不同的日期会发生变化,因此它并不总是对齐或明显使用)。
让甲骨文担心这更简单,更安全,正如韦尔弗里德所说,最好不要使用缩写名称来避免歧义和混淆 - 甚至是错误。
答案 1 :(得分:0)
尝试使用EXTRACT函数或TO_CHAR函数提取时间戳组件。然后使用TO_TIMESTAMP_TZ函数
设置适当的值