【问题标题】:How do I convert an oracle timestamp with time zone in plsql如何在 plsql 中转换带有时区的 Oracle 时间戳
【发布时间】:2014-11-26 10:29:12
【问题描述】:

如何将 PL/SQL 中的 oracle 'timestamp with time zone' 变量从一个时区转换为另一个时区? 变量声明如下:

v_date timestamp with time zone;

此语句在我的服务器上返回“-04:00”:

select dbtimezone from dual;

对于我们的示例,变量中的数据位于“EDT”(“-04:00”)中,我想转换为任意时区,例如“EET”(“+02:00”)和将其存储在不同的变量中:

v_date2 timestamp with time zone;

【问题讨论】:

标签: sql oracle plsql


【解决方案1】:

您可以使用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美国东部处于 EDT 而不是 EST 的时期。 (虽然时钟在不同的日期发生变化,所以使用哪个并不总是一致或明显的)。

让 Oracle 担心这一点更简单、更安全,正如 Wernfried 所说,最好不要使用缩写名称,以避免歧义和混淆 - 甚至是错误。

【讨论】:

  • 如果您想获取任意时区,最好不要使用缩写的时区名称,例如EET - 它们可能是模棱两可的,它会返回一个错误。请改用长区域名称,例如Europe/Helsinki。只有少数时区可以使用缩写名称,请查看SELECT * FROM v$timezone_names WHERE tzabbrev = tzname;
  • 是的,我同意,并且出于同样的原因,我说过不要使用小时/分钟偏移量。我只是使用 EET,因为 OP 引用了它,而我懒得在该区域中查找区域...
【解决方案2】:

尝试使用EXTRACT 函数或TO_CHAR 函数提取时间戳组件。然后使用TO_TIMESTAMP_TZ函数设置合适的值

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 2020-11-04
    • 2018-12-18
    • 1970-01-01
    • 2019-10-07
    • 1970-01-01
    • 2021-09-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多