Tiempo en un entorno replicado
La lógica de replicación se basa en la coherencia temporal entre todos los nodos NPS y gestores de colas de replicación. En un entorno replicado en el que los sistemas NPS se encuentran en zonas horarias diferentes, debe sincronizar las operaciones mediante un servicio de sincronización horaria, como Network Time Protocol (NTP). Para obtener más información, consulte Configuración de la red del lado del nodo en la documentación Cloud Pak for Data.
Tiempo y NPS
La hora del nodo NPS se basa en la hora del sistema host NPS. El entorno de ejecución de consultas utiliza este tiempo. Por defecto, la zona horaria se considera DESCONOCIDA. Sin embargo, puede anular el valor predeterminado especificando la información de la zona horaria para la variable de sesión TIMEZONE.
- Los tipos de datos temporales Netezza® (DATE, TIME y TIMESTAMP) almacenan valores de fecha, hora y marca de tiempo que no reflejan la zona horaria en la que se generaron.
- Se aceptan todos los literales legales de fecha, hora y fecha-hora de una sesión SQL.
- Las funciones SQL CURRENT_DATE, CURRENT_TIME y CURRENT_TIMESTAMP (también NOW) generan valores de fecha, hora y fecha-hora que reflejan la hora en la zona horaria actual. La zona horaria actual, por defecto, es la del host del servidor NPS. Puede anular esta zona horaria en una sesión SQL utilizando el comando SET TIME ZONE o, de forma equivalente, el comando SET TIMEZONE. Afecta a los valores que se generan cuando esa sesión llama a las tres funciones. Incluso en un único host Netezza, no tiene ninguna garantía de que los valores de fecha, hora o fecha-hora que se insertan desde diferentes sesiones de cliente (o la misma sesión, con diferentes configuraciones del comando SET TIME ZONE ) tengan alguna referencia de fecha-hora o zona horaria común.
- La aplicación debe gestionar si la interpretación de la zona horaria es relativa a los valores de fecha, hora y tiempo de las columnas de la tabla.
- Algunas herramientas incorporadas para manejar la información sobre la hora y la zona horaria incluyen el tipo de datos TIMETZ (un alias para el tipo de datos TIME WITH TIME ZONE) y la función TIMEZONE(). TIMETZ es un tipo de dato temporal ligeramente diferente, ya que los valores llevan un desfase de zona horaria, que puede especificar en literales TIMETZ (por ejemplo, '01:23:45-06'). Si en una columna TIMETZ se inserta un literal similar a la hora sin el desfase horario, Replication Services utiliza '+00' (GMT).
INSERT INTO ordertable values (1, current_timestamp, 'Product A');La fila de la tabla en el nodo NPS primario aparecería de la siguiente manera:
ORDERNUMBER | ORDERTIMESTAMP | ORDERDETAILS
------------+---------------------+--------------
1 | 2012-01-19 09:12:06 | Product AEsta fila también se replica en el nodo NPS réplica y tiene los mismos valores. Los valores son precisos; sin embargo, como se muestra en el ejemplo, no hay información para identificar a qué zona horaria se refiere esta información. En el momento del ejemplo, Nueva York está en hora estándar (EST), y la diferencia horaria entre allí y Londres es de 5 horas (-05). Dado que la fila se replica aproximadamente a la misma hora a la que se insertó, la hora se registra en el nodo NPS de réplica como las 14:12 hora local (GMT).
Soluciones a las diferencias horarias
- Haga que todas las horas sean relativas a una base común (por ejemplo, UTC o GMT).
- Capture información específica de la zona horaria siempre que se registre la hora.
- Capturar información de localización, ubicación o sistema para todos los registros (por ejemplo, en una columna Ubicación y una tabla de información de ubicación independiente).
Hacer que todos los tiempos sean relativos a una base común
En este enfoque, la aplicación que aplica los cambios en la base de datos convierte la información de todas las horas a una base común (por ejemplo, UTC o GMT). Para ello, se ajusta la variable de sesión TIMEZONE en NPS a la zona base requerida, con lo que todas las funciones relacionadas con el tiempo utilizan el mismo valor.
SYSTEM(ADMIN)=> SET TIMEZONE='GMT';
SET VARIABLE
SYSTEM(ADMIN)=> show timezone;
NOTICE: Time zone is GMT
SHOW VARIABLELa misma sentencia INSERT de la sección anterior registraría ahora la hora actual relativa a GMT:
ORDERNUMBER | ORDERTIMESTAMP | ORDERDETAILS
------------+---------------------+--------------
1 | 2012-01-19 14:12:06 | Product AEl sello de tiempo GMT es el valor que se replica al nodo NPS réplica en Londres. Como resultado, una aplicación de informes vería todas las filas actualizadas con los mismos valores.
ORDERNUMBER | TIMESTAMP | ORDERDETAILS
-------------+---------------------+--------------
8 | 2012-04-13 13:40:41 | t3
7 | 2012-04-13 13:40:25 | t2
6 | 2012-04-13 13:40:13 | t1
5 | 2012-04-13 13:34:32 | jki
4 | 2012-04-13 13:33:49 | def
3 | 2012-04-13 13:33:33 | abc
2 | 2012-04-12 14:41:40 | Product A
1 | 2012-04-12 14:33:03 | Product ASELECT ordernumber, timezone('PDT',
timestamp(substring(ordertimestamp,1,10),
timetz(substring(ordertimestamp, 12)))) as ts, orderdetails FROM
ordertable2 ORDER BY ts desc;
ORDERNUMBER | TS | ORDERDETAILS
------------+------------------------+--------------
8 | 2012-04-13 06:40:41-07 | t3
7 | 2012-04-13 06:40:25-07 | t2
6 | 2012-04-13 06:40:13-07 | t1
5 | 2012-04-13 06:34:32-07 | jki
4 | 2012-04-13 06:33:49-07 | def
3 | 2012-04-13 06:33:33-07 | abc
2 | 2012-04-12 07:41:40-07 | Product A
1 | 2012-04-12 07:33:03-07 | Product A
SELECT ordernumber, timezone('EDT',
timestamp(substring(ordertimestamp,1,10),
timetz(substring(ordertimestamp, 12)))) as ts, orderdetails FROM
ordertable2 ORDER BY ts desc;
ORDERNUMBER | TS | ORDERDETAILS
------------+------------------------+--------------
8 | 2012-04-13 09:40:41-04 | t3
7 | 2012-04-13 09:40:25-04 | t2
6 | 2012-04-13 09:40:13-04 | t1
5 | 2012-04-13 09:34:32-04 | jki
4 | 2012-04-13 09:33:49-04 | def
3 | 2012-04-13 09:33:33-04 | abc
2 | 2012-04-12 10:41:40-04 | Product A
1 | 2012-04-12 10:33:03-04 | Product AEn el caso de las aplicaciones que se ejecutan en distintas zonas horarias, las comparaciones horarias y el procesamiento pueden realizarse en relación con la zona horaria de la sesión de una aplicación. Como se muestra en los ejemplos, esto se hace utilizando una base de tiempo relativa común (por ejemplo, UTC).
Captura de información específica de la zona horaria
El planteamiento de captar e incluir información específica de la zona horaria es similar al de utilizar una base horaria común. Con el enfoque de capturar e incluir información específica de la zona horaria, también puede almacenar la configuración regional de origen de la información de la fila cuando los nodos NPS se encuentran en diferentes zonas horarias.
Debe cambiar el tipo de datos para la información de tiempo de TIMESTAMP a VARCHAR. Aún puede convertir la representación de caracteres de la información de la marca de tiempo en tipos relacionados con la fecha/hora para su uso en funciones, ya que varias funciones pueden aceptar un tipo de carácter variable. Alternativamente, puede utilizar campos separados para la información de fecha y hora, almacenando la hora mediante el tipo TIMETZ.
INSERT INTO ordertable2 values (1, timezone('EDT', current_timestamp),
'Product A');En este ejemplo, que utiliza la función TIMEZONE, la zona horaria de la variable de sesión se ha establecido primero en GMT (como en el ejemplo que utilizaba una base horaria relativa común en la sección anterior). Esto es necesario porque la representación del valor de la cadena de la hora que devuelve la función TIMEZONE se basa en el desfase de GMT que se especifica en el primer parámetro de la función (en este caso, 'EDT').
ORDERNUMBER | ORDERTIMESTAMP | ORDERDETAILS
------------+------------------------+--------------
1 | 2012-01-19 09:12:06-05 | Product ALa marca de tiempo ahora tiene la marca de tiempo del nodo NPS primario local (EST) pero con el desplazamiento en número de horas desde GMT ('-05'). Este valor se replica al nodo NPS réplica en Londres. Una aplicación de informes que se ejecuta en el nodo NPS de Londres puede ver que la hora de la fila indica que se originó en el nodo NPS de Nueva York. Sin embargo, la aplicación aún debe convertir la marca de tiempo a un valor de tiempo común, local o relativo para realizar comparaciones válidas en los valores.
Capturar la información del identificador de ubicación
La captura de la información del identificador de ubicación es similar al segundo enfoque. Sin embargo, en lugar de ajustar la hora a una base común y capturar el desfase relativo, este tercer enfoque utiliza la información que especifica la ubicación para generar el valor fecha-hora adecuado que puede utilizarse para convertir, identificar o buscar identificadores de ubicación. En este escenario, la configuración de la zona horaria de la sesión se deja como la configuración predeterminada de la zona horaria del sistema.
ORDERNUMBER | ORDERTIMESTAMP | ORDERDETAILS | LOC_CODE
------------+----------------------+--------------+----------
1 | 2012-01-19 09:12:06 | Product A | 1
LOC_CODE | LOCATIONCITY | LOCATIONTZ | TIMEZONEOFFSET
---------+------------------+------------+----------------
1 | New York, NY | EST | -5Puede personalizar el formato y la información almacenada para las necesidades específicas de la aplicación.
Otros enfoques similares capturan específicamente un identificador de zona horaria o un desfase horario, en lugar de un código de asignación a otra tabla. La clave es la capacidad de capturar información que luego pueda pasar información relevante que pueda pasarse a una función de conversión de tiempo como TIMEZONE(). Como se ilustra en el primer conjunto de ejemplos, puede convertir los valores de tiempo a una base común para el análisis, comparación, presentación de informes y otros fines.