2009-12-01 15 views
7

Estoy construyendo una aplicación web en la que los usuarios pueden introducir eventos, incluyendoCómo almacenar zona horaria en SQL Server 2005

  • título del evento
  • fecha/hora de inicio
  • Descripción

El los usuarios desean ingresar la fecha/hora de inicio, incluida una zona horaria que corresponda con la ubicación del evento. Los eventos son mundiales, por lo que la zona horaria puede cambiar de un evento a otro.

En la base de datos del servidor SQL Server, estoy usando datetime para la fecha/hora de inicio. ¿Qué tipo de columna debería usar para almacenar la zona horaria? ¿En t? ¿flotador? ¿decimal?

+0

¿Qué versión de SQL Server? SQL Server 2008 tiene datetimeoffset ... – mkedobbs

+0

SQL Server 2005 – frankadelic

+0

Consulte específicamente "Zona horaria! = Compensación" en [la wiki de la etiqueta de la zona horaria] (http://stackoverflow.com/tags/timezone/info). Una zona horaria no se puede representar completamente con solo un número. –

Respuesta

10

Las zonas horarias son cosas tramposas y malvadas. Normalmente se almacenan como un desplazamiento UTC, pero incluso eso tiene problemas con respecto a cosas como cuándo cambian los horarios de verano (si es que lo hacen).

Si está utilizando Sql Server 2008, puede utilizar un tipo datetimeoffset, que incluye el desplazamiento utc con el valor. De lo contrario, necesitarás dos columnas.

+0

Ugh, tenía 'datetime2' originalmente. confunde siempre eso para datetimeoffset :( –

0

Si está utilizando SQL Server 2008, puede usar datetimeoffset en lugar de datetime.

De lo contrario, utilizaría tinyint.

+2

TINYINT puede no ser lo suficientemente grande. Hay literalmente cientos de zonas horarias en todo el mundo, porque cada pequeño lugar quiere sentirse importante y decidir que su horario de verano cambia al mediodía del día después de los demás, etc. Actualmente, la base de datos muestra 245 zonas horarias distintas. Eso cabrá en un TINYINT, pero apenas. –

5

Dado que está utilizando SQL Server 2005, recomendaría almacenar la zona horaria como una cadena en la base de datos, específicamente una cadena de 32 caracteres, ya que es el límite de longitud para los identificadores de zona horaria en el registro de Windows.

Los valores guardados deben ser los valores de la propiedad TimeZoneInfo ID (por ejemplo, "Eastern Standard Time") para que pueda hacer cálculos en .NET Framework más fácilmente.

Como dijo Joel, las zonas horarias son malvadas y engañosas. Buena suerte ...