diciembre 6, 2021

Zona horaria de Oracle

Justo cuando pensabas que sabías dónde estabas, Oracle ha implementado zonas horarias para eliminarnos por completo. Ven y veamos dónde estamos en este gran planeta.

Unos pocos artículos atrás escribí sobre una comparación entre el tipo de datos de FECHA y el tipo de datos de MARCA DE TIEMPO. Este artículo va un paso más allá y explora la función de ZONA HORARIA de Oracle del tipo de datos de MARCA DE TIEMPO. En particular, Oracle ha agregado el «CON ZONA HORARIA «y el» CON ZONA HORARIA LOCAL » al tipo de datos DE MARCA DE TIEMPO.

Zonas horarias válidas

Tiene dos opciones al establecer a qué zona horaria pertenece la base de datos. Puede calificarlo como un desplazamiento desde GMT / UTC en el formato ‘hh: mm’ o puede especificarlo como un nombre que tenga una entrada en la tabla V.ZONA HORARIA. El listado 1 muestra el SQL que utilicé para mostrar el nombre de la zona horaria válida en la Zona Horaria Estándar de Montaña.

Listing 1
Mostrar nombres de zonas horarias 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

En el núcleo de las zonas horarias se encuentra la zona horaria de la base de datos. Puede ver la zona horaria seleccionada en la creación de la base de datos emitiendo el SQL en el Listado 2. Si desea cambiar la zona DBTIMEZONE, deberá emitir un comando ALTER DATBASE, como en Listing 3. Para que la nueva DBTIMEZONE surta efecto, debe rebotar la base de datos. Además, si tiene columnas de tipo de datos de la MARCA DE TIEMPO con ZONA HORARIA definida, no podrá restablecer la ZONA HORARIA. Después de rebotar la base de datos, puede emitir el SQL en Listing 4 para validar que el cambio se ha producido. Si quisieras volver al » hh:formato mm » para DBTIMEZONE, solo emita el SQL en la lista 5.

Listing 2
Compruebe la zona horaria de la base de datos

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

Listing 3
Cambiar la zona horaria de la base de datos

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

Listing 4
Validar el cambio en DBTIMEZONE

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

Listing 5
Cambiar de DBTIMEZONE a formato hh: mm

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

SESSIONTIMEZONE

Si no desea utilizar la zona horaria de la base de datos, Oracle le ofrece la opción de establecer la zona horaria a nivel de sesión. Emita el SQL en la lista 6 si desea una zona horaria diferente para la sesión actual a la que está conectado. Puede comprobar la zona horaria de la sesión emitiendo el SQL en la lista 7.

Listing 6
Establecer zona horaria en el nivel de sesión

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

Listing 7
Comprobar la zona horaria del nivel de sesión

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

SYSTIMESTAMP

Así como hay una llamada a SYSDATE para obtener la fecha y hora actual del sistema, hay una llamada para obtener la fecha, hora y zona horaria actuales del sistema. El tipo de datos devuelto es de MARCA DE TIEMPO CON ZONA HORARIA. Emita el SQL en Listing 8 para obtener la información de la hora actual del sistema.

Listing 8
Obtener la marca de tiempo del sistema actual con información de zona horaria

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

CURRENT_TIMESTAMP

La parte del contador de la función SYSTIMESTAMP para la fecha y hora actuales de la sesión es la llamada a la función CURRENT_TIMESTAMP. Esto devolverá la marca de tiempo actual de la sesión en relación con la zona horaria de la sesión (SESSIONTIMEZONE). Por lo tanto, si tenemos la zona horaria de la sesión como se define en la Lista 6, podemos verificar la marca de tiempo de la sesión emitiendo el SQL en la Lista 9.

Listing 9
Marca de tiempo local para la sesión

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

Tipo de datos de marca DE HORA con Información de zona HORARIA

En el corazón del almacenamiento de información de zona horaria dentro de una tabla, Oracle ha definido el tipo de datos de marca de HORA. Esta es la gran nueva esperanza de Oracle para dar al antiguo tipo de datos de FECHA un mecanismo más granular de retención no solo de información de fecha y hora, sino también de segundos fraccionados. Mire una comparación de los tipos de datos de FECHA y HORA de Oracle para obtener una discusión de este tipo de base de datos. Para el resto de este artículo y con el fin de explotar las opciones de zona horaria para el tipo de datos de MARCA DE TIEMPO, he creado una tabla como se define en la Tabla 1. En el listado 10, he creado un ejemplo rápido de cómo se comportarán la MARCA DE TIEMPO CON ZONA HORARIA y la MARCA DE TIEMPO CON tipos DE datos DE ZONA HORARIA LOCAL cuando se usen para almacenar información. Para empezar, he establecido la ZONA HORARIA de DBTIMEZONE y la ZONA HORARIA DE SESIÓN para que tengan el mismo valor ‘-07: 00’. Luego inserto en la TABLA de FECHA el valor de una marca de tiempo del sistema. A continuación, cambio la zona horaria de la sesión actual solo para que sea ‘-03:00’. Esto establecerá la sesión actual cuatro horas antes de la zona horaria de la base de datos. Luego inserto en la DATE_TABLE una fila que contendrá la marca de tiempo de la sesión actual. La idea principal a entender aquí es que la columna con MARCA DE TIEMPO de tipo de datos CON ZONA HORARIA almacena y muestra la hora explícita suministrada desde la instrucción INSERT. La columna con MARCA DE TIEMPO DE tipo DE datos CON ZONA HORARIA LOCAL almacena la hora explícita suministrada, pero mostrará un valor relativo a la zona horaria de la sesión actual. Esto significa que si desea MARCAS DE TIEMPO rígidas y rápidas con información de zona horaria almacenada, debe usar la MARCA DE TIEMPO CON el tipo DE datos DE ZONA HORARIA. Si le preocupa más dar información de fecha y hora a clientes en diferentes zonas horarias y representados en su hora local, debe usar la MARCA DE tiempo CON el tipo DE datos DE ZONA HORARIA LOCAL.

Tabla 1:

Crear tabla con diferentes columnas de marca DE tiempo

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

LISTING 10
Insertar la MARCA de sistema en 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

Todos hemos crecido y aceptado zonas horarias. Siempre ha sido fácil hacer la diferencia horaria en nuestras cabezas al llamar a alguien o viajar a una zona horaria diferente. Por alguna razón, la implementación de zonas horarias a través de compensaciones del GMT/UTC me dificultó conceptualizar y averiguar dónde y qué hora es realmente. Yo sugeriría que jueguen con el ejemplo que les he dado para que puedan familiarizarse con esta característica y en qué parte de la tierra se encuentran.

» Ver todos los artículos del columnista James Koopmann

Deja una respuesta

Tu dirección de correo electrónico no será publicada.