问题描述
我有一张表,显示了与我通过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