如何将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;