如何将Sql Server 2008 DateTimeOffset转换为日期时间
我希望将具有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
。
干杯:)
使用几乎任何样式将导致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
注:时区信息转化丢弃如果没有指定样式( “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;
我会使用内置的SQL选项:
select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
我知道这是一个老问题,但是,如果您想将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值包含一个假设,即该值在服务器的时区。
什么是风格126?为什么126? – 2011-02-10 09:10:11
@ Pure.Krome请参阅答复中的CAST和CONVERT链接。因为我喜欢ISO 8601,所以不得不选择一个。它与网络维基挑选1没有区别。正如所指出的(在两个答案中)某些样式*可能不考虑TZ。 – 2011-02-10 13:44:08
SQL Server 2008 R2中的快速测试显示只使用样式“0”或(等同)省略样式代码丢弃时区信息。 MSDN文档中列出的任何其他代码将保留它。 – 2012-07-26 17:28:21