Después de de esta larga búsqueda de datos pudimos resolver este disgusto que tienen algunos lectores. Te regalamos la respuesta y deseamos resultarte de gran ayuda.
Solución:
La conversión usando 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
según lo siguiente, por lo que es una forma rápida de convertir de Datetimeoffset(offset!=0)
para 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
Usaría la opción SQL incorporada:
select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
Sé que esta es una pregunta antigua, pero si desea convertir DateTimeOffset en DateTime, creo que debe tener en cuenta la zona horaria del servidor en el que está convirtiendo. Si solo hace una CONVERTIR (fechahora, @MiFecha, 1), simplemente perderá la zona horaria, lo que probablemente resulte en una conversión incorrecta.
Creo que primero debe cambiar el desplazamiento del valor 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 la zona horaria del servidor o el desplazamiento del valor DateTime, se convertirá a DateTime en la zona horaria del servidor.
Creo que debe hacer esto porque un valor DateTime incluye la suposición de que el valor está en la zona horaria del servidor.