Подтвердить что ты не робот

Как преобразовать 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'.

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

4b9b3361

Ответ 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 цифр (и точность меньше этой). То же самое с datetime2datetimeoffset(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