J'ai un tableau qui montre le fuseau horaire sur une base de données différente de celle où je copie certaines données via dblink. La valeur est écrite comme ceci "America / Lima"

Est-il possible d'obtenir le décalage (-5) dans oracle.

Je dois l'utiliser dans une vue au lieu de "INTERVAL '5' HOUR":

GROUP BY
        TRUNC(smoe_date - INTERVAL '5' HOUR)
0
Dinu Nicolae 23 oct. 2020 à 12:07

2 réponses

Meilleure réponse

TZ_OFFSET, je présume:

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

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

SQL>

Si vous voulez le numéro , une option peut être

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>

En l'utilisant comme résultat d'une requête d'une autre table: vous ne pouvez pas mettre tout SELECT dans la fonction; faites-le via rejoindre. Par exemple (pas très intelligent, mais - illustre ce que je voulais dire). Comme vous disposez déjà de la table T_CONFIG, votre requête commencerait à partir de la ligne 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>
4
Littlefoot 23 oct. 2020 à 11:04

En utilisant

GROUP BY some_date AT TIME ZONE 'America/Lima'

Devrait être plus pratique, je pense. Ou peut-être celui-ci:

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

Si vous aimez vraiment obtenir le décalage du fuseau horaire, je vous suggère plutôt

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

Au lieu de REGEXP

1
Wernfried Domscheit 23 oct. 2020 à 10:40