如何在oracle中从varchar中获取时区偏移量



我有一个表,它显示了不同数据库上的时区,我通过dblink从中复制了一些数据。该值是这样写的";America/Lima";

有可能在oracle中得到偏移量(-5(吗。

我需要在视图中使用它,而不是";间隔‘5’小时":

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

TZ_OFFSET,我推测:

SQL> select tz_offset('America/Lima') from dual;
TZ_OFFS
-------
-05:00
SQL>

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

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

最新更新