Oracle
 sql >> Base de Dados >  >> RDS >> Oracle

Como retornar uma lista de fusos horários válidos no banco de dados Oracle


Às vezes, precisamos especificar um fuso horário ao usar funções de data e hora no Oracle.

Mas há muitos fusos horários por aí. Como nos lembramos de todos eles? E como sabemos que nosso sistema suporta um determinado fuso horário?

Felizmente, podemos consultar o V$TIMEZONE_NAMES view para retornar uma lista de fusos horários válidos.

Obter todas as informações de fuso horário


O código a seguir retorna todas as linhas e colunas da exibição:
SELECT * FROM V$TIMEZONE_NAMES;

Há muitas linhas nesta visualização, mas aqui está a aparência das primeiras 10 linhas:
               TZNAME    TZABBREV    CON_ID 
_____________________ ___________ _________ 
Africa/Abidjan        LMT                 0 
Africa/Abidjan        GMT                 0 
Africa/Accra          LMT                 0 
Africa/Accra          GMT                 0 
Africa/Accra          +0020               0 
Africa/Addis_Ababa    LMT                 0 
Africa/Addis_Ababa    EAT                 0 
Africa/Addis_Ababa    +0230               0 
Africa/Addis_Ababa    +0245               0 
Africa/Algiers        LMT                 0 
...

Podemos ver que cada nome de região de fuso horário tem mais de uma abreviação correspondente. Isso serve para coisas como horário de verão, etc.

Aqui está uma tabela que descreve o que algumas das abreviações significam:
Abreviação de fuso horário Significado
LMT Hora Média Local
PMT Hora Média de Paris
MOLHADO Hora da Europa Ocidental
OESTE Horário de verão da Europa Ocidental
CET Horário da Europa Central
CEST Horário de verão da Europa Central
EET Horário da Europa Oriental
EEST Horário de verão da Europa Oriental

Obtenha apenas os nomes das regiões


Podemos usar o DISTINCT ou UNIQUE cláusula para retornar apenas os nomes das regiões de fuso horário sem duplicatas.
SELECT DISTINCT TZNAME 
FROM V$TIMEZONE_NAMES
ORDER BY TZNAME ASC;

Veja como estão as primeiras 10 linhas agora:
               TZNAME 
_____________________ 
Africa/Abidjan        
Africa/Accra          
Africa/Addis_Ababa    
Africa/Algiers        
Africa/Asmara         
Africa/Asmera         
Africa/Bamako         
Africa/Bangui         
Africa/Banjul         
Africa/Bissau         
...

Obter todas as abreviações de um determinado nome de fuso horário


Aqui está um exemplo de uma consulta que retorna todas as abreviações de um determinado nome de fuso horário:
SELECT 
    TZNAME,
    TZABBREV
FROM V$TIMEZONE_NAMES
WHERE TZNAME LIKE '%Sydney%'
ORDER BY TZNAME ASC;

Resultado:
             TZNAME    TZABBREV 
___________________ ___________ 
Australia/Sydney    LMT         
Australia/Sydney    AEDT        
Australia/Sydney    AEST        

Sobre arquivos de fuso horário


No Oracle Database, os nomes de fuso horário estão contidos em arquivos de fuso horário.

Você pode consultar o V$TIMEZONE_FILE view para ver qual arquivo de fuso horário está sendo usado pelo banco de dados.

Exemplo:
SELECT * FROM V$TIMEZONE_FILE;

Resultado:
          FILENAME    VERSION    CON_ID 
__________________ __________ _________ 
timezlrg_32.dat            32         0 

Meu sistema está usando a versão 32, que é o arquivo de fuso horário padrão para o Oracle 19c (que é o que estou usando). Este arquivo está localizado no seguinte local:$ORACLE_HOME/oracore/zoneinfo/timezlrg_32.dat

Consulte a documentação da Oracle para Escolher um arquivo de fuso horário para obter mais informações sobre arquivos de fuso horário.