Pregunta

Mi aplicación de base de datos se implementará en varios sitios en diferentes zonas horarias.

Necesito una función T-SQL que determine 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 de YEAR (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 DST 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 almacenarlo en una tabla, pero preferiría no hacerlo. Supongo que esta es una situación perfecta para utilizar la integración de CLR en SQL Server 2005. Me pregunto si hay una solución T-SQL que desconozco.

¿Fue útil?

Solución

Consulte esta pregunta y respuesta anteriores para obtener información relacionada:

Con eficacia Conversión de fechas entre UTC y hora local (es decir, PST) en SQL 2005

(Para resumir, es necesario crear tablas de zona horaria y horario de verano en Sql Server 2005. En la próxima versión de Sql Server obtendremos ayuda con las zonas horarias).

Otros consejos

A menos que me equivoque, la función GETUTCDATE () utiliza la zona horaria definida en el servidor; no tiene información sobre la zona horaria del cliente (o cualquier zona horaria). No creo que la información se almacene 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 ¿El archivo de zona horaria de Oracle y crea tu propia función de SQL Server?

Fuera del tema (podría ser útil para otra persona), pero si estuviera usando Oracle, podría usar la función FROM_TZ y 'ZONA HORARIA':

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

Hmm, supongo que no estoy entendiendo el problema. Si la aplicación de la 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 tendría que ser algo como:

(timestamp + (getutcdate() - getdate())) > cast('01/01/2008' as datetime)

El DST puede estar activado o desactivado dependiendo de cuándo en el año se ejecuta la consulta, pero getdate () lo tiene en cuenta , así que tienes que calcular dinámicamente el desplazamiento cada vez.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top