如何从oracle中的varchar获取时区偏移量?
How to get timezone offset from varchar in oracle?
我有一个 table,它显示与我通过 dblink 复制一些数据的数据库不同的数据库上的时区。值是这样写的“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>
如果您想要号码,一个选项可能是
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>
作为另一个 table 的查询结果使用它:您不能将整个 SELECT
放入函数中;通过加入来做到这一点。例如(不是很聪明,但是-说明了我的意思)。由于您已经有了 T_CONFIG
table,您的查询将从第 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
我有一个 table,它显示与我通过 dblink 复制一些数据的数据库不同的数据库上的时区。值是这样写的“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>
如果您想要号码,一个选项可能是
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>
作为另一个 table 的查询结果使用它:您不能将整个 SELECT
放入函数中;通过加入来做到这一点。例如(不是很聪明,但是-说明了我的意思)。由于您已经有了 T_CONFIG
table,您的查询将从第 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