Я знаю, что это старый вопрос, но если вы хотите преобразовать 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 включает в себя предположение, что это значение находится в часовом поясе сервера.
Можно ли объяснить, что означает последний аргумент «1» от CONVERT? Все примеры этого аргумента используют типы символов как выходные или типы ввода. Здесь мы преобразуем datetimeoffset в datetime. –
Функция 'convert()' принимает третий параметр, который определяет формат вывода. [Https://www.w3schools.com/sql/func_convert.asp](https://www.w3schools.com/sql/func_convert.asp). 1 = "mm/dd/yy" format –
Этот третий аргумент действительно не имеет никакого смысла для преобразования из 'datetimeoffset' в' datetime2'. Это для конверсий 'varchar'. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql (также W3Schools? так много лучших вариантов сейчас!) – brianary