Как преобразовать Sql Server 2008 DateTimeOffset в DateTime
Я надеюсь преобразовать таблицу с полем 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 a 'DATETIMEOFFSET', but 'UTC'.
Приветствия :)
Ответы
Ответ 1
Преобразование с использованием почти любого стиля приведет к преобразованию значения 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
Ответ 2
Я бы использовал встроенную функцию SQL:
select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
Ответ 3
Я знаю, что это старый вопрос, но если вы хотите преобразовать DateTimeOffset в DateTime, я думаю, вам нужно учитывать часовой пояс сервера, на котором вы конвертируете. Если вы просто выполняете CONVERT (datetime, @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' в DateTime на сервере, который компенсирует -7: 00, будет 2013-11-20 17: 00: 00.000. В приведенной выше логике он не соответствует часовому поясу сервера или смещению значения DateTime, он будет преобразован в DateTime в часовой пояс серверов.
Я считаю, что вам нужно сделать это, потому что значение DateTime включает в себя предположение, что это значение находится в часовом поясе сервера.
Ответ 4
Примечание. Информация о часовом поясе отбрасывается при преобразовании, если не указан стиль (здесь "126"). Я также не знаю, что он может быть отклонен и в некоторых других стилях - в любом случае следующее корректно корректирует информацию TZ. Смотрите CAST и CONVERT.
select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc;
Счастливого SQL'а.
Изменить
Не уверен, имеет ли это значение, но... datetime
Не могу сохранить этот уровень точности/точности. Если вышеприведенное выполнено, дробные секунды будут усечены до 3 цифр (и точность меньше этой). То же самое с datetime2
(и datetimeoffset(7)
) дает не усеченное значение:
select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc;
Ответ 5
Чтобы учесть летнее время, я использовал следующее:
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