我希望将具有DATETIMEOFFSET
字段的表格转换为DATETIME
字段,但要注意偏移量,重新计算时间。实际上,这会将值转换为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 -- that's a `DATETIMEOFFSET`, but `UTC`.
干杯:)
答案 0 :(得分:51)
使用几乎任何样式进行转换都会导致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
答案 1 :(得分:24)
我使用内置的SQL选项:
select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
答案 2 :(得分:18)
我知道这是一个老问题但是,如果你想将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())));
将“2013-11-21 00:00:00.0000000 -00:00”转换为偏移量为-7:00的服务器上的DateTime的结果为2013-11-20 17:00:00.000。使用上述逻辑,它不会影响服务器的时区或DateTime值的偏移量,它将在服务器时区中转换为DateTime。
我认为你需要这样做,因为DateTime值包含一个假设,即该值在服务器的时区内。
答案 3 :(得分:5)
注意:如果未指定样式(此处为“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;
答案 4 :(得分:2)
SQL Server中的DateTimeoffset(时区)转换。
SQL Server 2016(13.x)及更高版本
示例
Select GETUTCDATE() Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'Central European Standard Time') Select Convert(DATETIME, GETUTCDATE() AT TIME ZONE 'UTC' AT TIME ZONE 'India Standard Time')
结果将
2020-08-18 08:22:21.640 2020-08-18 10:22:21.640 2020-08-18 13:52:21.640
答案 5 :(得分:0)
为了考虑夏令时,我使用以下方法:
CONVERT(
DateTime,
SWITCHOFFSET(
CONVERT(
DateTimeOffset,
CONVERT(
DateTime,
[time_stamp_end_of_interval],
120
)
),
DATENAME(
TzOffset,
CONVERT(
DateTime,
[time_stamp_end_of_interval],
120
) AT TIME ZONE 'Pacific Standard Time'
)
)
)
AS GOOD_PST
注意:time_stamp_end_of_interval
是一个varchar