如何将Sql Server 2008 DateTimeOffset转换为DateTime

我希望将具有DATETIMEOFFSET字段的表转换为DATETIMEOFFSET字段,但通过注意偏移量来重新计算时间。 这实际上将该值转换为UTC

例如。

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

将被转换为

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

要么

CreatedOn: 2008-12-19 06:30:09.0000000 + 00:00 < – 这是一个DATETIMEOFFSET ,但UTC

干杯:)

使用几乎任何样式转换将导致datetime2值被转换为UTC。
此外,从datetime2到datetimeoffset的转换只需在+00:00处设置偏移量,因此它是从Datetimeoffset(offset!=0)Datetimeoffset(+00:00)的快速方法Datetimeoffset(offset!=0)

 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 

我会使用内置的SQL选项:

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

我知道这是一个古老的问题,但是,如果你想将DateTimeOffset转换为DateTime,我认为你需要考虑你所转换的服务器的时区。 如果你只是做一个CONVERT(date时间,@MyDate,1),你只会失去时区,这可能会导致不正确的转换。

我想你首先需要切换DateTimeOffset值的偏移量,然后进行转换。

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

将“2013-11-21 00:00:00.0000000 -00:00”转换为-7:00的服务器的date时间为2013-11-20 17:00:00.000。 使用上面的逻辑,它不会考虑服务器的时区或DateTime值的偏移量,它将在服务器时区中转换为DateTime。

我相信你需要这样做,因为date时间值包括一个假设,该值是在服务器的时区。

注意:如果未指定样式(此处为“126”),则时区信息在转换中丢弃 。 它也可能被丢弃在其他一些风格,我不知道 – 在任何情况下,以下正确调整TZ信息。 请参阅CAST和CONVERT 。

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

快乐SQL'ing。

编辑

不知道是否重要,但… datetime实际上不能存储的精度/准确度的水平。 如果以上运行,小数秒将被截断为3位数(精度低于该数字)。 与datetime2 (和datetimeoffset(7) )一样,产生一个非截断的值:

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