2011-02-10 163 views
27

我希望将具有DATETIMEOFFSET字段的表转换为DATETIME字段但是通过注意偏移量来重新计算时间。这实际上将该值转换为UTC如何将Sql Server 2008 DateTimeOffset转换为日期时间

例如。

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

干杯:)

回答

45

使用几乎任何样式将导致DATETIME2值转换为被转换为UTC。
此外,从DATETIME2转换为DATETIMEOFFSET简单地设置在+00:00偏移,每下面,所以它是一个快速的方法来从Datetimeoffset(offset!=0)转换为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 
3

注:时区信息转化丢弃如果没有指定样式( “126” 在这里)的。它可能也会被丢弃在其他一些风格中,我不知道 - 在任何情况下,以下内容都可以正确调整TZ信息。见CAST and 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; 
+0

什么是风格126?为什么126? – 2011-02-10 09:10:11

+0

@ Pure.Krome请参阅答复中的CAST和CONVERT链接。因为我喜欢ISO 8601,所以不得不选择一个。它与网络维基挑选1没有区别。正如所指出的(在两个答案中)某些样式*可能不考虑TZ。 – 2011-02-10 13:44:08

+1

SQL Server 2008 R2中的快速测试显示只使用样式“0”或(等同)省略样式代码丢弃时区信息。 MSDN文档中列出的任何其他代码将保留它。 – 2012-07-26 17:28:21

17

我会使用内置的SQL选项:

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

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

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

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

转换的结果是 ':00:2013年11月21日00 00.0000000 -00:00' 到谁的偏移的服务器上的日期时间为-7:00将是2013年11月20日17:00 :00.000。通过上述逻辑,它不会计算服务器的时区或DateTime值的偏移量,它将在服务器时区中转换为DateTime。

我相信你需要这样做,因为DateTime值包含一个假设,即该值在服务器的时区。

相关问题