tipo example ejemplo dato convert sql sql-server tsql sql-server-2008 datetimeoffset

example - insert time sql server



Migre la columna DateTime de SQL Server a DateTimeOffset (6)

Tengo una vieja tabla con algunas filas que tiene una columna de fecha y hora. Quiero cambiar esto a datetimeoffset pero quiero poder transferir los datos que ya existen. Entonces estoy haciendo algo como:

SET IDENTITY_INSERT Table_Temp ON INSERT INTO Table_Temp (Col0, ... ColN,) SELECT COl0,.... ColN, from Table_Original; SET IDENTITY_INSERT Table_Temp OFF

Esto funciona, pero el conjunto de compensación es 0 cuando hago la asignación de dattime a datetimeoffset. Afortunadamente, el desplazamiento que quiero establecer es el desplazamiento del sistema actual. No soy un gurú de tsql, pero parece que no puedo encontrar una forma fácil de hacerlo.

Quiero ser capaz de establecer el desplazamiento dentro de la conversión. Iba a recurrir a la utilidad ac # (o PowerShell), pero prefiero mantenerlo simple.


Puede averiguar cuál es el desplazamiento del servidor SQL actual utilizando lo siguiente.

select datediff(MI,getdate(), getutcdate())

Necesita obtener el desplazamiento en minutos y no en horas, ya que hay un huso horario de media hora e incluso de un cuarto de hora.

Usando el valor de los minutos, puede alterar los valores entrantes (suponiendo que históricamente se registraron todos como hora local) usando algo como

select dateadd(mi,datediff(MI,getdate(), getutcdate()), yourDateField)

Por eficiencia lo calcularía una vez en una variable y lo usaría, ya que la diferencia no va a cambiar.


Vea a continuación el documento, probablemente desee algo como:

-- up here set the @time_zone variable. INSERT INTO Table_Temp (Col0, ... ColN,) SELECT COl0, TODATETIMEOFFSET(COLDATE, @time_zone),.... ColN, from Table_Original;

Desde MSDN

La función SWITCHOFFSET ajusta un valor de DATETIMEOFFSET de entrada a una zona horaria específica, conservando al mismo tiempo el valor UTC. La sintaxis es SWITCHOFFSET (datetimeoffset_value, time_zone). Por ejemplo, el siguiente código ajusta el valor de datetimeoffset del sistema actual a la zona horaria GMT +05: 00:

SELECCIONE SWITCHOFFSET (SYSDATETIMEOFFSET (), ''-05: 00'');

Entonces, si el valor de timetimeoffset del sistema actual es el 12 de febrero de 2009 10: 00: 00.0000000 -08: 00, este código devuelve el valor 12 de febrero de 2009 13: 00: 00.0000000 -05: 00.

La función TODATETIMEOFFSET establece el desplazamiento de zona horaria de un valor de fecha y hora de entrada. Su sintaxis es TODATETIMEOFFSET (date_and_time_value, time_zone).

Esta función es diferente de SWITCHOFFSET de varias maneras. Primero, no está restringido a un valor datetimeoffset como entrada; más bien acepta cualquier tipo de datos de fecha y hora. En segundo lugar, no intenta ajustar la hora en función de la diferencia de huso horario entre el valor de origen y la zona horaria especificada, sino que simplemente devuelve el valor de fecha y hora de entrada con la zona horaria especificada como un valor datetimeoffset.

El objetivo principal de la función TODATETIMEOFFSET es convertir los tipos que no tienen en cuenta la zona horaria a DATETIMEOFFSET por el desplazamiento de zona horaria dado. Si el valor de fecha y hora especificado es DATETIMEOFFSET, la función TODATETIMEOFFSET cambia el valor DATETIMEOFFSET basado en el mismo valor de fecha y hora local original más la nueva compensación de zona horaria dada.

Por ejemplo, el valor de datetimeoffset del sistema actual es el 12 de febrero de 2009 10: 00: 00.0000000 -08: 00 y ejecuta el siguiente código:

SELECT TODATETIMEOFFSET (SYSDATETIMEOFFSET (), ''-05: 00'');

Se devuelve el valor 12 de febrero de 2009 10: 00: 00.0000000 -05: 00. Recuerde que la función SWITCHOFFSET devolvió el 12 de febrero de 2009 13: 00: 00.0000000 -05: 00 porque ajustó el tiempo según las diferencias de huso horario entre la entrada (-08: 00) y la zona horaria especificada (-05: 00) .

Como se mencionó anteriormente, puede usar la función TODATETIMEOFFSET con cualquier tipo de datos de fecha y hora como entrada. Por ejemplo, el siguiente código toma el valor actual de fecha y hora del sistema y lo devuelve como un valor de fecha y hora de salida con un huso horario -00: 05:

SELECT TODATETIMEOFFSET (SYSDATETIME (), ''-05: 00'');


Si está utilizando una versión de SQL Server que conoce el tipo datetimeoffset, esta sintaxis funcionará para obtener el desplazamiento tz local del servidor:

select datepart(tz,sysdatetimeoffset())

El resultado está en MINUTOS.


Estas funciones de conversión no funcionarán correctamente si el guardado de DST está activo en la zona horaria objetivo, ya que el desfase de la zona horaria cambia dentro del mismo año.



Esta es una ligera variación de una respuesta ya provista, y NO representa los cambios del horario de verano. Sin embargo, podría ser lo suficientemente bueno para muchos propósitos:

dateadd(minute, -datepart(tz, sysdatetimeoffset()), @legacyDatetime)