No Oracle Database, os fusos horários podem ser definidos em vários locais. Abaixo estão quatro maneiras de alterar o fuso horário ao usar o Oracle.
Definir o fuso horário do banco de dados
Você pode definir o fuso horário do banco de dados ao criar o banco de dados. Para fazer isso, use o
SET TIME_ZONE
cláusula do CREATE DATABASE
demonstração. Exemplo:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Nesse caso, usei um nome de região de fuso horário. Consulte Como retornar uma lista de fusos horários válidos no banco de dados Oracle para obter uma lista completa de nomes de regiões válidos em seu sistema.
Como alternativa, você pode usar um deslocamento de fuso horário real:
CREATE DATABASE mySampleDb
...
SET TIME_ZONE='+10:00';
Se você não definir explicitamente o fuso horário ao criar o banco de dados, o padrão será o fuso horário do sistema operacional do servidor.
Você também pode alterar a configuração de fuso horário atual para o banco de dados. Para fazer isso, use o
ALTER DATABASE
demonstração. Exemplo:
ALTER DATABASE mySampleDb
...
SET TIME_ZONE='Australia/Sydney';
Observe que o fuso horário do banco de dados é relevante apenas para
TIMESTAMP WITH LOCAL TIME ZONE
colunas. Além disso, a Oracle recomenda que você defina o fuso horário do banco de dados como UTC (0:00) para evitar a conversão de dados e melhorar o desempenho quando os dados são transferidos entre bancos de dados. Definir o fuso horário da sessão
Você pode definir o fuso horário da sessão independentemente do fuso horário do banco de dados. Quando você retorna
TIMESTAMP WITH LOCAL TIME ZONE
data, ele é retornado no fuso horário da sessão atual. O fuso horário da sessão também entra em vigor quando um
TIMESTAMP
o valor é convertido para o TIMESTAMP WITH TIME ZONE
ou TIMESTAMP WITH LOCAL TIME ZONE
tipo de dados. Você pode fazer algumas coisas para definir o fuso horário no nível da sessão.
Tele ORA_SDTZ
Variável de ambiente
Você pode definir o fuso horário da sessão com o
ORA_SDTZ
variável de ambiente. Isso pode ser definido para os seguintes valores:- Fuso horário local do sistema operacional (
'OS_TZ'
) - Fuso horário do banco de dados (
'DB_TZ'
) - Deslocamento absoluto do UTC (por exemplo,
'-04:00'
) - Nome da região do fuso horário (por exemplo,
'America/St_Kitts'
)
Aqui estão alguns exemplos de configuração dessa variável de ambiente em um ambiente UNIX:
% setenv ORA_SDTZ 'OS_TZ'
% setenv ORA_SDTZ 'DB_TZ'
% setenv ORA_SDTZ 'America/St_Kitts'
% setenv ORA_SDTZ '-04:00'
O valor padrão do
ORA_SDTZ
variável é 'OD_TZ'
. Este valor é usado quando a variável não está definida ou está definida com um valor inválido. A ALTER SESSION
Declaração
Você pode alterar o fuso horário de uma sessão SQL específica com o
SET TIME_ZONE
cláusula do ALTER SESSION
demonstração. TIME_ZONE
pode ser definido para os seguintes valores:- Fuso horário local padrão quando a sessão foi iniciada (
local
) - Fuso horário do banco de dados (
dbtimezone
) - Deslocamento absoluto do UTC (por exemplo,
'-04:00'
) - Nome da região do fuso horário (por exemplo,
'Canada/Eastern'
)
Aqui está um exemplo de configuração de
TIME_ZONE
a tais valores:ALTER SESSION SET TIME_ZONE=local;
ALTER SESSION SET TIME_ZONE=dbtimezone;
ALTER SESSION SET TIME_ZONE='Canada/Eastern';
ALTER SESSION SET TIME_ZONE='-04:00';
Você pode verificar o fuso horário da sua sessão atual com o
SESSIONTIMEZONE
função. Exemplo:
SELECT SESSIONTIMEZONE FROM DUAL;
Resultado:
Australia/Brisbane
No meu caso, o fuso horário da sessão está definido como Austrália/Brisbane.
O AT TIME ZONE
Cláusula
Uma expressão de data e hora pode incluir um
AT LOCAL
cláusula ou um AT TIME ZONE
cláusula. Se você incluir um AT LOCAL
cláusula, o resultado será retornado no fuso horário da sessão atual. Se você incluir o AT TIME ZONE
cláusula, o fuso horário pode ser um dos seguintes:- Um deslocamento de fuso horário
- Um nome de região de fuso horário
DBTIMEZONE
(esta função retorna o fuso horário do banco de dados)SESSIONTIMEZONE
(esta função retorna o fuso horário da sessão atual)- Uma expressão que retorna uma string de caracteres com um formato de fuso horário válido.
Exemplo:
SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT TIME ZONE '+12:00'
FROM DUAL;
Resultado:
02/JAN/30 04:30:35.000000000 AM +12:00
Neste caso eu usei o
FROM_TZ()
função para converter um valor de timestamp e um fuso horário em um TIMESTAMP WITH TIME ZONE
valor. Eu então usei o AT TIME ZONE
cláusula para especificar um fuso horário diferente. Aqui está o mesmo exemplo, exceto que desta vez eu especifico
AT LOCAL
:SELECT
FROM_TZ(TIMESTAMP '2030-01-01 12:30:35', '-04:00')
AT LOCAL
FROM DUAL;
Resultado:
02/JAN/30 02:30:35.000000000 AM AUSTRALIA/BRISBANE