Oracle Fuso horário
apenas quando você pensou que sabia onde estava, a Oracle implementou fusos horários para nos separar totalmente. Venha e vamos descobrir onde estamos neste grande planeta.
alguns artigos que escrevi em uma comparação entre o datatype data e o datatype TIMESTAMP. Este artigo vai um passo além e explora o recurso de fuso horário da Oracle do tipo de data e hora. Em particular, a Oracle adicionou o “com Fuso horário “e o” com Fuso horário LOCAL ” ao tipo de data e hora.
fusos horários válidos
você tem duas opções ao definir a qual fuso horário o banco de dados pertence. Você pode qualificá-lo como um deslocamento de GMT/UTC no formato de ‘hh:mm’ ou pode especificá-lo como um nome que tenha uma entrada na tabela de fuso horário V$. A listagem 1 mostra o SQL que usei para exibir o nome de fuso horário válido no fuso horário padrão da Montanha.
Listagem 1
Mostrar nomes de fuso horário válidos para MST
SQL> select tzname,tzabbrev from V$TIMEZONE_NAMES where tzabbrev = 'MST'TZNAME TZABBREV------------------------- ----------America/Denver MSTAmerica/Edmonton MSTAmerica/Ensenada MSTAmerica/Mazatlan MSTAmerica/Mexico_City MSTAmerica/Phoenix MSTAmerica/Regina MSTAmerica/Shiprock MSTAmerica/Tijuana MSTCanada/East-Saskatchewan MSTCanada/Mountain MSTCanada/Saskatchewan MSTEurope/Moscow MSTMexico/BajaNorte MSTMexico/BajaSur MSTMexico/General MSTMST MSTMST7MDT MSTNavajo MSTUS/Arizona MSTUS/Mountain MSTW-SU MST
DBTIMEZONE
no núcleo dos Fusos Horários está o fuso horário do banco de dados. Você pode ver o fuso horário selecionado na criação do banco de dados emitindo o SQL na Listagem 2. Se você quiser alterar o DBTIMEZONE, precisará emitir um comando ALTER DATBASE, como na Listagem 3. Para que o novo DBTIMEZONE entre em vigor, você deve saltar o banco de dados. Além disso, se você tiver quaisquer colunas de tipo de dados que são do carimbo de data / hora com Fuso horário definido, você não será capaz de redefinir o DBTIMEZONE. Depois de saltar o banco de dados, você pode emitir o SQL na Listagem 4 para validar que a mudança ocorreu. Se você quiser voltar para o ” hh:mm ” formato para DBTIMEZONE, basta emitir o SQL na Listagem 5.
Listagem 2
Verificar o banco de dados de fuso horário
SQL> select DBTIMEZONE from dual;DBTIME-------07:00
a Listagem 3
Alterar o banco de dados de fuso horário
SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.
Listagem 4
Validar a alteração no DBTIMEZONE
SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver
Listagem 5
voltar DBTIMEZONE para o formato hh:mm
SQL> ALTER database SET TIME_ZONE = '-07:00';
SESSIONTIMEZONE
Se você não quiser usar o banco de dados de fuso horário, a Oracle oferece a você a opção para definir o fuso horário no nível de sessão. Emita o SQL na Listagem 6 se você quiser um fuso horário diferente para a sessão atual à qual você está conectado. Você pode verificar o fuso horário da sessão emitindo o SQL na listagem 7.
Listagem 6
Definir fuso horário no nível de sessão
SQL> alter session set TIME_ZONE='-03:00';Session altered.
Listagem 7
Verificar o nível de sessão de fuso horário
SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00
SYSTIMESTAMP
, assim como há uma chamada para SYSDATE para obter a actual data e hora do sistema, há uma chamada para obter a data atual do sistema, a hora e o fuso horário. O tipo de dados retornado é de carimbo de data / hora com Fuso horário. Emita o SQL na lista 8 para obter as informações atuais do tempo do sistema.
listagem 8
obtenha o carimbo de data / hora atual do sistema com informações de fuso horário
SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00
CURRENT_TIMESTAMP
a parte contrária da função SYSTIMESTAMP para a data e hora atuais da sessão é a chamada da função CURRENT_TIMESTAMP. Isso retornará Qual é o carimbo de hora atual da sessão em relação ao fuso horário da sessão (SESSIONTIMEZONE). Portanto, se tivermos o fuso horário da sessão conforme definido na Listagem 6, podemos verificar o carimbo de data / hora da sessão emitindo o SQL na listagem 9.
listagem 9
carimbo de data / hora Local para sessão
SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00
datatype TIMESTAMP com informações de fuso horário
no coração de armazenar informações de fuso horário dentro de uma tabela, Oracle definiu o tipo de dados TIMESTAMP. Esta é a grande nova esperança da Oracle para dar ao datatype de data antiga um mecanismo mais granular de manter não apenas informações de data e hora, mas também segundos fracionários. Veja uma comparação dos tipos de dados de data e carimbo de data / hora da Oracle para uma discussão sobre esse tipo de banco de dados. Para o restante deste artigo e para fins de exploração das opções de fuso horário para o tipo de data e hora, criei uma tabela conforme definido na Tabela 1. Na listagem 10, criei um exemplo rápido de como o carimbo de data / hora com Fuso horário e carimbo de data / hora com tipos de dados de fuso horário LOCAL se comportará quando usado para armazenar informações. Para começar, defini o DBTIMEZONE e o fuso horário da sessão como o mesmo valor ‘-07: 00’. Em seguida, insiro no DATE_TABLE o valor de um carimbo de data / hora do sistema. Em seguida, mudo o fuso horário da sessão atual apenas para ‘-03: 00’. Isso definirá a sessão atual quatro horas antes do fuso horário do banco de dados. Em seguida, insiro na tabela de dados uma linha que manterá o carimbo de data / hora da sessão atual. A ideia principal a entender aqui é que a coluna com carimbo de data / hora datatype com armazenamentos de fuso horário e exibe o tempo explícito fornecido na instrução INSERT. A coluna com datatype TIMESTAMP com Fuso horário local armazena o tempo explícito fornecido, mas exibirá um valor relativo ao fuso horário da sessão atual. Isso significa que, se você quiser carimbos de data / hora rígidos e rápidos com informações de fuso horário armazenadas, use o carimbo de data / hora com o tipo de data / hora do fuso horário. Se você estiver mais preocupado em fornecer informações de data e hora aos clientes em fusos horários diferentes e representados em sua hora local, use o carimbo de data / hora com o tipo de dados de fuso horário LOCAL.
Tabela 1:
Criar tabela com diferentes colunas de CARIMBO de
create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);
LISTAGEM 10
Inserir SYSTIMESTAMP em DATE_TABLE
SQL> select dbtimezone,sessiontimezone from dual;DBTIMEZONE SESSIONTIMEZONE---------- -----------------07:00 -07:00SQL> insert into date_table values (SYSTIMESTAMP,SYSTIMESTAMP);1 row created.SQL> alter session set time_zone='-03:00';Session altered. SQL> select dbtimezone,sessiontimezone from dual;DBTIMEZONE SESSIONTIMEZONE---------- -----------------07:00 -03:00SQL> insert into date_table values (LOCALTIMESTAMP,LOCALTIMESTAMP );1 row created.SQL> select time_stamp_tz, time_stamp_ltz from date_table;TIME_STAMP_TZ TIME_STAMP_LTZ------------------------------------- ------------------------------01-SEP-03 10.57.36.642000 AM -07:00 01-SEP-03 02.57.36.642000 PM01-SEP-03 02.57.48.549000 PM -03:00 01-SEP-03 02.57.48.549000 PMSQL> alter session set time_zone='-07:00';Session altered.SQL> select time_stamp_tz, time_stamp_ltz from date_table;TIME_STAMP_TZ TIME_STAMP_LTZ------------------------------------- ------------------------------01-SEP-03 10.57.36.642000 AM -07:00 01-SEP-0310.57.36.642000 AM01-SEP-03 02.57.48.549000 PM -03:00 01-SEP-0310.57.48.549000 AM
Nós todos crescemos e aceito os fusos horários. Sempre foi fácil fazer a diferença de horas em nossas cabeças ao ligar para alguém ou viajar para um fuso horário diferente. Por alguma razão, a implementação de fusos horários por meio de deslocamentos do GMT/UTC tornou difícil para mim conceituar e descobrir onde e que horas realmente são. Eu sugiro que você brinque com o exemplo que eu lhe dei para que você possa se familiarizar com esse recurso e onde você está na terra.
” veja todos os artigos do colunista James Koopmann