2008-10-07 15 views
5

Mi aplicación de base de datos se implementará en varios sitios en diferentes zonas horarias.Determinar el desfase de zona horaria en T-SQL

Necesito una función T-SQL que determinará la marca de tiempo UTC de la medianoche del 1 de enero del año actual para los cálculos de YTD. Todos los datos se almacenan en marcas de tiempo UTC.

Por ejemplo, Chicago es UTC-6 con horario de verano (DST), la función debe devolver '2008-01-01 06:00:00' si se ejecuta en cualquier momento en 2008 en Chicago. Si se ejecuta en Nueva York (GMT-5 + DST) el próximo año, debe devolver '2009-01-01 05:00:00'.

Puedo obtener el año actual del AÑO (GETDATE()). Pensé que podría hacer un DATEDIFF entre GETDATE() y GETUTCDATE() para determinar el desplazamiento, pero el resultado depende de si la consulta se ejecuta durante el horario de verano o no. No conozco ninguna función T-SQL incorporada para determinar el desplazamiento o si la hora actual es DST o no.

¿Alguien tiene una solución a este problema en T-SQL? Podría codificarlo o guardarlo en una mesa pero preferiría no hacerlo. Supongo que esta es una situación perfecta para usar CLR Integration en SQL Server 2005. Me pregunto si hay una solución T-SQL que desconozco.

Respuesta

2

Compruebe hacia fuera esta pregunta anterior y responder por relacionado información:

Effectively Converting dates between UTC and Local (ie. PST) time in SQL 2005

(. en resumen, usted necesita para construir tablas de zona horaria y horario de verano en SQL Server 2005. en la próxima versión de SQL Server que conseguimos un poco de ayuda con las zonas horarias)

+0

Gracias Eric. Implementé una solución basada en tablas como la que sugirió en el pasado. Me preguntaba si había algo que había echado de menos que me haría la vida más fácil. –

0

Hm, supongo que no entiendo el problema. Si la aplicación de base de datos ya está almacenando las marcas de tiempo UTC para todas sus transacciones, y desea resumir algunos valores desde la primera "hora local" del año, su condición debería ser algo así como:

(marca de tiempo + (getUTCDate() - getdate()))> Reparto ('01/01/2008' como fecha y hora)

el horario de verano puede ser en o fuera dependiendo de cuando en el año se ejecuta la consulta - pero getdate() lo tiene en cuenta, por lo que debe calcular dinámicamente el desplazamiento cada vez.

Yo ... creo ... :-)

+0

El desplazamiento sería relativo a la fecha actual, no a una fecha de arbritrary en el futuro. Además, sería relativo al huso horario del servidor, no al del cliente. – neonski

0

Si no me equivoco, el GETUTCDATE() utiliza la función de la zona horaria definida en el servidor - que no tiene información sobre la zona horaria del cliente (o cualquier zona horaria). No creo que la información esté almacenada en ningún lugar de SQL Server 2005, lo que hace que sea imposible calcular esta información.

¿Tal vez podría 'tomar prestados' los datos de Oracle's time zone file y crear su propia función de SQL Server?

Off Topic (podría ser útil para alguien más), pero si se utiliza Oracle, puede utilizar la función FROM_TZ y 'EN EL TIEMPO DE LA ZONA':

FROM_TZ(YOUR_TIMESTAMP, 'UTC') AT TIME ZONE 'America/Dawson_Creek'