Dicembre 6, 2021

Oracle Time Zone

Proprio quando pensavi di sapere dove ti trovavi, Oracle ha implementato i fusi orari per escluderci completamente. Vieni e cerchiamo di capire dove siamo su questo grande pianeta.

Alcuni articoli indietro ho scritto su un confronto tra il datatype DATA e il datatype TIMESTAMP. Questo articolo fa un ulteriore passo avanti ed esplora la funzione di fuso ORARIO di Oracle del tipo di dati TIMESTAMP. In particolare, Oracle ha aggiunto ” CON FUSO ORARIO “e” CON FUSO ORARIO LOCALE ” al tipo di dati TIMESTAMP.

Fusi orari validi

Sono disponibili due opzioni quando si imposta il fuso orario a cui appartiene il database. Puoi qualificarlo come spostamento da GMT / UTC nel formato ‘hh: mm’ oppure puoi specificarlo come un nome che ha una voce nella tabella V TIM TIMEZONE. Il listato 1 mostra l’SQL che ho usato per visualizzare il nome del fuso orario valido nel fuso orario standard di montagna.

Listato 1
Mostra i nomi dei fusi orari validi per 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

Al centro dei fusi orari è il fuso orario del database. È possibile guardare il fuso orario selezionato alla creazione del database emettendo SQL nel listato 2. Se si desidera modificare DBTIMEZONE è necessario emettere un comando ALTER DATBASE come nel Listato 3. Affinché il nuovo DBTIMEZONE abbia effetto, è necessario rimbalzare il database. Inoltre, se si dispone di colonne di tipo di dati che sono del TIMESTAMP con FUSO ORARIO definito, non sarà possibile ripristinare DBTIMEZONE. Dopo aver rimbalzato il database, è possibile emettere SQL nel listato 4 per convalidare che la modifica abbia avuto luogo. Se si voleva tornare al ” hh:mm ” formato per DBTIMEZONE, basta emettere SQL nel listato 5.

Listato 2
Controllare il database di fuso orario

SQL> select DBTIMEZONE from dual;DBTIME-------07:00

Listato 3
Modifica il database di fuso orario

SQL> ALTER database SET TIME_ZONE = 'America/Denver';Database altered.

Listato 4
confermare il cambio in DBTIMEZONE

SQL> select DBTIMEZONE from dual;DBTIMEZONE---------------America/Denver

Listato 5
tornare DBTIMEZONE di formato hh:mm

SQL> ALTER database SET TIME_ZONE = '-07:00';

SESSIONTIMEZONE

Se non si desidera utilizzare il database di fuso orario, Oracle dà la possibilità di impostare il fuso orario a livello di sessione. Emettere SQL nel listato 6 se si desidera un fuso orario diverso per la sessione corrente a cui si è connessi. È possibile controllare il fuso orario della sessione emettendo SQL nel listato 7.

Listato 6
Impostare il fuso orario a livello di sessione

SQL> alter session set TIME_ZONE='-03:00';Session altered.

Listato 7
Controllare il livello di sessione orario orario

SQL> select SESSIONTIMEZONE from dual;SESSIONTIMEZONE--------------------------------------------------03:00

SYSTIMESTAMP

così come c’è una chiamata per SYSDATE per ottenere la data e ora del sistema, c’è una chiamata per ottenere l’attuale sistema di data, ora e fuso orario. Il tipo di dati restituito è di TIMESTAMP CON FUSO ORARIO. Emettere SQL nel listato 8 per ottenere le informazioni sull’ora del sistema corrente.

Elenco 8
Ottieni il timestamp del sistema corrente con le informazioni sul fuso orario

SQL> select SYSTIMESTAMP from dual;SYSTIMESTAMP-----------------------------------------------01-SEP-03 10.53.13.574000 AM -07:00

CURRENT_TIMESTAMP

La parte contatore della funzione SYSTIMESTAMP per la data e l’ora correnti della sessione è la chiamata alla funzione CURRENT_TIMESTAMP. Ciò restituirà quale sia il timestamp corrente della sessione in relazione al fuso orario della sessione (SESSIONTIMEZONE). Pertanto, se abbiamo il fuso orario della sessione come definito nel Listato 6, possiamo controllare il timestamp della sessione emettendo l’SQL nel Listato 9.

Elenco 9
Timestamp locale per la sessione

SQL> select CURRENT_TIMESTAMP from dual;CURRENT_TIMESTAMP-------------------------------------------------01-SEP-03 02.53.33.753000 PM 03:00

Tipo di dati TIMESTAMP con Informazioni sul FUSO ORARIO

Al centro della memorizzazione delle informazioni sul fuso orario all’interno di una tabella, Oracle ha definito il tipo di dati TIMESTAMP. Questa è la grande nuova speranza di Oracle per dare al vecchio tipo di DATA un meccanismo più granulare di contenere non solo informazioni su data e ora ma anche secondi frazionari. Guarda un confronto tra i tipi di dati DATA e TIMESTAMP di Oracle per una discussione su questo tipo di database. Per il resto di questo articolo e allo scopo di sfruttare le opzioni del fuso orario per il tipo di dati TIMESTAMP, ho creato una tabella come definita nella Tabella 1. Nel listato 10, ho creato un rapido esempio di come il TIMESTAMP CON FUSO ORARIO e il TIMESTAMP CON i tipi di dati DEL FUSO ORARIO LOCALE si comporteranno quando vengono utilizzati per memorizzare le informazioni. Per cominciare ho impostato DBTIMEZONE e SESSION TIMEZONE sullo stesso valore’-07:00′. Quindi inserisco nel DATE_TABLE il valore di un timestamp di sistema. Quindi cambio il fuso orario per la sessione corrente solo per essere’-03:00′. Questo imposterà la sessione corrente quattro ore prima del fuso orario del database. Inserisco quindi nella DATE_TABLE una riga che manterrà il timestamp della sessione corrente. L’idea principale da cogliere qui è che la colonna con datatype TIMESTAMP CON FUSO ORARIO memorizza e visualizza l’ora esplicita fornita dall’istruzione INSERT. La colonna con datatype TIMESTAMP CON FUSO ORARIO LOCALE memorizza l’ora esplicita fornita ma visualizzerà un valore relativo al fuso orario della sessione corrente. Ciò significa che se si desidera un TIMESTAMP rigido e veloce con le informazioni sul fuso orario memorizzate, è necessario utilizzare il TIMESTAMP CON il tipo DI dati DEL FUSO ORARIO. Se sei più interessato a fornire informazioni su data e ora ai clienti in fusi orari diversi e rappresentati nella loro ora locale, dovresti utilizzare il TIMESTAMP CON il tipo DI dati DEL FUSO ORARIO LOCALE.

Tabella 1:

Crea una tabella con diverse colonne di TIMESTAMP

create table date_table ( time_stamp_tz TIMESTAMP WITH TIME ZONE, time_stamp_ltz TIMESTAMP WITH LOCAL TIME ZONE);

LISTATO 10
Inserimento di SYSTIMESTAMP in 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

Siamo tutti cresciuti e abbiamo accettato i fusi orari. È sempre stato facile fare la differenza di ora nelle nostre teste quando si chiama qualcuno o si viaggia in un fuso orario diverso. Per qualche ragione l’implementazione dei fusi orari attraverso gli offset del GMT/UTC mi ha reso difficile concettualizzare e capire dove e a che ora è veramente. Ti suggerisco di giocare con l’esempio che ti ho dato in modo che tu possa conoscere questa caratteristica e dove ti trovi sulla terra.

” Vedi tutti gli articoli dell’editorialista James Koopmann

Lascia un commento

Il tuo indirizzo email non sarà pubblicato.