uso tamaño insertar datos convert como sql sql-server sql-server-2008 datetime datetimeoffset

tamaño - ¿Cómo puedo convertir un Sql Server 2008 DateTimeOffset a DateTime?



tamaño datetime sql server (4)

Espero convertir una tabla que tenga un campo DATETIMEOFFSET , hasta un campo DATETIME PERO recalcula el tiempo al tomar nota del desplazamiento. Esto, en efecto, convierte el valor en UTC .

p.ej.

CreatedOn: 2008-12-19 17:30:09.0000000 +11:00

que se convertirá en

CreatedOn: 2008-12-19 06:30:09.0000000

o

CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 -- that''s a `DATETIMEOFFSET`, but `UTC`.

Saludos :)


La conversión con casi cualquier estilo hará que el valor datetime2 se convierta a UTC.
Además, la conversión de datetime2 a datetimeoffset simplemente establece el desplazamiento en +00:00 , por debajo, por lo que es una manera rápida de convertir de Datetimeoffset(offset!=0) a Datetimeoffset(+00:00)

declare @createdon datetimeoffset set @createdon = ''2008-12-19 17:30:09.1234567 +11:00'' select CONVERT(datetime2, @createdon, 1) --Output: 2008-12-19 06:30:09.12 select convert(datetimeoffset,CONVERT(datetime2, @createdon, 1)) --Output: 2008-12-19 06:30:09.1234567 +00:00


Nota: La información de la zona horaria se descarta en la conversión si no se especifica ningún estilo ("126" aquí). También podría descartarse en algunos de los otros estilos, no sé; en cualquier caso, lo siguiente se ajusta correctamente para la información TZ. Ver CAST y CONVERT .

select convert(datetime, cast(''2008-12-19 17:30:09.0000000 +11:00'' as datetimeoffset), 126) as utc;

Happy SQL''ing.

Editar

No estoy seguro de si importa, pero ... datetime No puedo almacenar ese nivel de precisión / precisión. Si se ejecuta lo anterior, los segundos fraccionarios se truncarán en 3 dígitos (y la precisión es menor que eso). Lo mismo, con datetime2 (y datetimeoffset(7) ) produce un valor no truncado:

select convert(datetime2, cast(''2008-12-19 17:30:09.1234567 +11:00'' as datetimeoffset(7)), 126) as utc;


Sé que esta es una vieja pregunta, pero si quieres convertir DateTimeOffset a DateTime, creo que debes tener en cuenta la zona horaria del servidor en el que estás convirtiendo. Si acaba de hacer un CONVERTIR (datetime, @MyDate, 1), simplemente perderá el huso horario, lo que probablemente resulte en una conversión incorrecta.

Creo que primero necesita cambiar el desplazamiento del valor de DateTimeOffset y luego hacer la conversión.

DECLARE @MyDate DATETIMEOFFSET = ''2013-11-21 00:00:00.0000000 -00:00''; SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET())));

El resultado de convertir ''2013-11-21 00: 00: 00.0000000 -00: 00'' a DateTime en un servidor cuyo desplazamiento es -7: 00 será 2013-11-20 17: 00: 00.000. Con la lógica anterior, no importa cuál sea el huso horario del servidor o el desplazamiento del valor de DateTime, se convertirá a DateTime en la zona horaria de los servidores.

Creo que debe hacer esto porque un valor de DateTime incluye una suposición de que el valor está en la zona horaria del servidor.


Usaría la opción SQL incorporada:

select SWITCHOFFSET(cast(''2008-12-19 17:30:09.0000000 +11:00'' as datetimeoffset),''+00:00'')