Estate atento ya que en este tutorial hallarás el arreglo que buscas.
Solución:
No creo que el código anterior funcione. La razón es que depende de la diferencia entre la fecha actual en horario local y UTC. Por ejemplo, aquí en California ahora estamos en PDT (hora de verano del Pacífico); la diferencia entre esta hora y UTC es de 7 horas. El código provisto, si se ejecuta ahora, agregará 7 horas a cada fecha que se desee convertir. Pero si se convierte una fecha histórica almacenada, o una fecha en el futuro, y esa fecha no es durante el horario de verano, aún agregará 7, cuando el desplazamiento correcto es 8. En pocas palabras: no puede convertir la fecha/hora correctamente entre zonas horarias (incluido UTC, que no obedece al horario de verano) con sólo mirar la fecha actual. Debe tener en cuenta la fecha en sí que está convirtiendo, en cuanto a si el horario de verano estaba vigente en esa fecha. Además, las fechas en las que se cambia el horario diurno y estándar también han cambiado (¡George Bush cambió las fechas durante su administración para los EE. UU.!). En otras palabras, cualquier solución que incluso haga referencia a getdate() o getutcdate() no funciona. Debe analizar la fecha real que se va a convertir.
Con SQL Server 2016, ahora hay soporte integrado para zonas horarias con el AT TIME ZONE
declaración. Puede encadenar estos para hacer conversiones:
SELECT YourOriginalDateTime AT TIME ZONE 'Pacific Standard Time' AT TIME ZONE 'UTC'
O bien, esto también funcionaría:
SELECT SWITCHOFFSET(YourOriginalDateTime AT TIME ZONE 'Pacific Standard Time', '+00:00')
Cualquiera de estos interpretará la entrada en hora del Pacífico, tendrá en cuenta correctamente si el horario de verano está en vigor o no y luego lo convertirá a UTC. El resultado será un datetimeoffset
con desplazamiento cero.
Más ejemplos en el anuncio de CTP.
Si todos son locales para usted, aquí está la compensación:
SELECT GETDATE() AS CurrentTime, GETUTCDATE() AS UTCTime
y debería poder actualizar todos los datos usando:
UPDATE SomeTable
SET DateTimeStamp = DATEADD(hh, DATEDIFF(hh, GETDATE(), GETUTCDATE()), DateTimeStamp)
¿Funcionaría eso, o me estoy perdiendo otro ángulo de este problema?
Acuérdate de que tienes la capacidad de aclarar si te fue útil.