zona operaciones horaria fechas con cambiar sql sql-server sql-server-2005 timezone

operaciones - cambiar zona horaria sql server



Determine el desplazamiento de zona horaria en T-SQL (3)

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

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.


A menos que me equivoque, la función GETUTCDATE () usa la zona horaria definida en el servidor; no tiene información con respecto a 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 imposibilita el cálculo de esta información.

¿Tal vez podría "tomar prestados" los datos del archivo de zona horaria de Oracle y construir su propia función de SQL Server?

Fuera del tema (podría ser útil para otra persona), pero si usaba Oracle, podría usar la función FROM_TZ y ''AT TIME ZONE'':

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


Hm, supongo que no estoy entendiendo 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 tendría que ser algo así como:

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

El horario de verano puede estar activado o desactivado según el año en que se ejecute la consulta, pero getdate () lo tiene en cuenta, por lo que debe calcular dinámicamente el desplazamiento cada vez.

Creo ... :-)