如何从oracle中的varchar获取时区偏移?

问题描述

我有一张表,显示了与我通过dblink复制一些数据不同的db上的时区。该值写为“ America / Lima”

是否可以在oracle中获取偏移量(-5)。

我需要在视图中使用它,而不是“ INTERVAL'5'HOUR”:

GROUP BY
        Trunc(smoe_date - INTERVAL '5' HOUR)

解决方法

TZ_OFFSET,我想:

SQL> select tz_offset('America/Lima') from dual;

TZ_OFFS
-------
-05:00

SQL>

如果您想要 number ,一个选项可能是

SQL> select to_number(regexp_substr(tz_offset('America/Lima'),'-?\d+')) lima,2         to_number(regexp_substr(tz_offset('Europe/Berlin'),'-?\d+')) berlin
  3  from dual;

      LIMA     BERLIN
---------- ----------
        -5          2

SQL>

从另一个表查询结果开始使用它:您不能将整个SELECT放入函数中;通过加入来完成。例如(不是很聪明,但是-说明了我的意思)。由于您已经有了T_CONFIG表,因此您的查询将从第2行开始。

SQL> WITH t_config AS (SELECT 'TIME_ZONE' name,'America/Lima' VALUE FROM DUAL)
  2    SELECT MAX (ename)
  3      FROM emp e CROSS JOIN t_config t
  4  GROUP BY TRUNC (
  5                hiredate
  6              - TO_NUMBER (REGEXP_SUBSTR (TZ_OFFSET (t.VALUE),'-?\d+')))
  7  /

MAX(ENAME)
----------
SMITH
BLAKE
TURNER
ADAMS
<snip>
,

使用

GROUP BY some_date AT TIME ZONE 'America/Lima'
我认为

应该更方便。或者也许是这样:

GROUP BY SYS_EXTRACT_UTC(some_date AT TIME ZONE 'America/Lima')

如果您真的想获取时区偏移,那么我建议

EXTRACT(TIMEZONE_HOUR FROM FROM_TZ(LOCALTIMESTAMP,'America/Lima'))
EXTRACT(TIMEZONE_MINUTE FROM FROM_TZ(LOCALTIMESTAMP,'America/Lima')) 

代替REGEXP