如何在plsql中将oracle时间戳与时区转换

时间:2014-10-01 14:30:42

标签: sql oracle plsql

如何将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;

2 个答案:

答案 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函数

设置适当的值