Как я могу преобразовать Sql Server 2008 DateTimeOffset в DateTime - PullRequest
37 голосов
/ 10 февраля 2011

Я надеюсь преобразовать таблицу с полем 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`.

Приветствия:)

Ответы [ 4 ]

54 голосов
/ 10 февраля 2011

Преобразование с использованием практически любого стиля приведет к преобразованию значения 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
25 голосов
/ 21 августа 2014

Я бы использовал встроенную опцию SQL:

select SWITCHOFFSET(cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset),'+00:00')
18 голосов
/ 17 июня 2016

Я знаю, что это старый вопрос, но, если вы хотите преобразовать 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 включает предположение, что это значение находится в часовом поясе сервера.

6 голосов
/ 10 февраля 2011

Примечание: информация о часовом поясе отбрасывается в преобразовании, если не указан стиль (здесь «126»).Я также не знаю, что он может быть отброшен в некоторых других стилях - в любом случае следующее корректно корректирует информацию TZ.См. CAST и CONVERT .

select convert(datetime, cast('2008-12-19 17:30:09.0000000 +11:00' as datetimeoffset), 126) as utc;

Happy SQL'ing.

Редактировать

Не уверен, что это важно, но... datetime Невозможно сохранить этот уровень точности.Если вышеприведенное выполнено, дробные секунды будут усечены до 3 цифр (и точность меньше этой).То же самое с datetime2datetimeoffset(7)) дает не усеченное значение:

select convert(datetime2, cast('2008-12-19 17:30:09.1234567 +11:00' as datetimeoffset(7)), 126) as utc;
...