En un escenario distribuido, las consultas se ejecutan en los servidores. Al consultar datos con predicados de tipo calendar, java.util.Date y timestamp, el valor de fecha y hora especificado en una consulta se basa en el huso horario local del servidor.
En un sistema de un solo huso horario donde todos los clientes y servidores se ejecutan en un mismo huso horario, no es necesario tener en cuenta cuestiones relacionadas con los tipos de predicado con calendar, java.util.Date y timestamp. No obstante, cuando los clientes y los servidores están en husos horarios diferentes, el valor de fecha y hora especificado en las consultas se basa en el huso horario del servidor y puede devolver datos no deseados al cliente. Si se desconoce el huso horario del servidor, el valor de fecha y hora especificado no tiene sentido. Por lo tanto, el valor de fecha y hora especificado debe tener en cuenta la diferencia de desplazamiento de huso horario entre el huso horario de destino y el huso horario del servidor.
Por ejemplo, supongamos que un cliente está en el huso horario [GMT-0] y el servidor está en el huso horario [GMT-6]. El huso horario del servidor está 6 horas por detrás del cliente. El cliente querría ejecutar la consulta siguiente:
SELECT e FROM Employee e WHERE e.birthDate='1999-12-31 06:00:00'
Suponiendo que la entidad Employee (empleado) tiene un atributo birthDate (fecha de nacimiento) que es del tipo java.util.Date, el cliente está en el huso horario [GMT-0] y desea recuperar empleados con un valor de birthDate como, por ejemplo '1999-12-31 06:00:00 [GMT-0]' de acuerdo con su huso horario.
La consulta se ejecutará en el servidor y el valor de birthDate utilizado por el motor de consulta será '1999-12-31 06:00:00 [GMT-6]', que equivale a '1999-12-31 12:00:00 [GMT-0]'. Los empleados con un valor de birthDate igual a '1999-12-31 12:00:00 [la GMT-0]' se devolverán al cliente. De este modo, el cliente dejará de obtener empleados deseados con un valor de birthDate de '1999-12-31 06:00:00 [GMT-0]'.
El problema descrito ocurre debido a la diferencia de huso horario entre cliente y servidor. Para solucionar este problema, un método consiste en calcular el desplazamiento de huso horario entre el cliente y el servidor y aplicar el desplazamiento de huso horario al valor de fecha y hora de destino en la consulta. En el ejemplo de consulta anterior, el desplazamiento de huso horario es de -6 horas y el predicado birthDate ajustado debe ser “birthDate='1999-12-31 00:00:00'” si el cliente tiene la intención de recuperar a empleados con el valor de birthDate '12-31 06:00:00 [GMT-0]'. Con el valor de birthDate ajustado, el servidor utilizará '1999-12-31 00:00:00 [GMT-6]', que equivale al valor de destino '12-31 06:00:00 [GMT-0]', y se devolverán al cliente los empleados necesarios.
Si la cuadrícula de eXtreme Scale distribuida se despliega en varios servidores ObjectGrid en varios husos horarios, el método de ajuste de desplazamiento del huso horario no funcionará porque el cliente no sabrá qué servidor ejecutará la consulta y, por lo tanto, no podrá determinar el desplazamiento de huso horario que debe utilizar. La única solución consiste en utilizar el sufijo ‘Z' (no sensible a mayúsculas y minúsculas) en la fecha JDBC y el formato de escape de hora para indicar que se utiliza el valor de fecha y hora basado en el huso horario GMT. El sufijo ‘Z' (no sensible a mayúsculas y minúsculas) indica que se debe utilizar el valor de fecha y hora basado en el huso horario GMT. Sin el sufijo ‘Z', se utilizará el valor de fecha y hora basado en el huso horario local en el proceso que ejecuta la consulta.
La consulta siguiente equivale al ejemplo anterior, pero en su lugar utiliza el sufijo ‘Z':
SELECT e FROM Employee e WHERE e.birthDate='1999-12-31 06:00:00Z'
La consulta debe encontrar empleados con un valor de birthDate ‘1999-12-31 06:00:00'. El sufijo ‘Z' indica que el valor de birthDate especificado está basado en el huso horario GMT, de modo que el motor de consulta utilizará el valor de birthDate ‘1999-12-31 06:00:00 GMT-0]' para encontrar los valores de criterio. Los empleados con un valor de atributo birthDate igual a este valor de birthDate ‘1999-12-31 06:00:00 [GMT-0]' basado en GMT se incluirán en el resultado de la consulta. Utilizar el sufijo ‘Z' en el formato de escape de fecha y hora JDBC en cualquier consulta resulta crucial para conseguir que el huso horario de las aplicaciones resulte seguro. Sin este método, el valor de fecha y hora se basa en el huso horario del servidor y no tiene sentido desde la perspectiva del cliente cuando los clientes y los servidores están en husos horarios diferentes.
Para obtener más información, consulte Datos para distintos husos horarios.