SQL Server Cómo persistir y usar una hora en diferentes zonas horarias

En SQL Server me gustaría crear una tabla para save el time de un evento, y me gustaría convertirlo en la zona horaria de la elección de los usuarios para fines de visualización. Digamos que si hubiera un evento que ocurriera en Londres a la 1:00 PM GMT, eso sería a las 8:00 a.m. ES EST.

Dado este ejemplo, me gustaría crear un trabajo de marco,

  1. donde un usuario tendría la capacidad de save el evento y la hora (dando la zona horaria del evento)

  2. Lea esos events, con la hora que se muestra en la zona horaria de su agrado (US EST)

¿Cómo logro esto en SQL Server?

En SQL Server 2008, use el tipo de datos DATETIMEOFFSET que es DATETIME más un desplazamiento de zona horaria incluido.

 SELECT CAST('2010-11-23 16:35:29+09:00' AS datetimeoffset) 

sería el 23 de noviembre de 2010, a las 4:35 p.m. en una zona horaria de +9 horas (desde GMT).

SQL Server 2008 también contiene funciones y commands SQL para convertir los valores de DATETIMEOFFSET de una zona horaria a otra:

 SELECT SWITCHOFFSET(CAST('2010-11-23 16:35:29+09:00' AS datetimeoffset), '+01:00') 

daría como resultado:

 2010-11-23 08:35:29.0000000 +01:00 

La misma hora, diferente zona horaria (+1 hora desde GMT)

  1. Cuando guarde los datos, guarde el GMT, no la hora local para el usuario (en c # esto es DateTime.UtcNow )
  2. En la lógica de la aplicación, registre la zona horaria del usuario y traduzca la hora GMT a la hora local del usuario utilizando el desplazamiento de la zona horaria, en time de ejecución.

La forma en que he resuelto un problema similar es hacer lo siguiente:

  1. El layout de la tabla es solo almacenar la hora GMT.
  2. Toda la input pasa por un process almacenado que requiere una input de un desplazamiento de zona horaria.
  3. La request de datos es para una function con valores de tabla , con una input para el desplazamiento de la zona horaria.