wiem, jest to stara sprawa, ale jeśli chcesz przekonwertować datetimeoffset do DateTime, myślę, że trzeba wziąć pod uwagę strefę czasową serwera jesteś konwersji na. Jeśli po prostu wykonasz CONVERT (datetime, @MyDate, 1), stracisz strefę czasową, co prawdopodobnie spowoduje błędną konwersję.
Myślę, że najpierw trzeba przełączyć przesunięcie wartości DateTimeOffset, a następnie wykonaj konwersję.
DECLARE @MyDate DATETIMEOFFSET = '2013-11-21 00:00:00.0000000 -00:00';
SELECT CONVERT(DATETIME, SWITCHOFFSET(@MyDate, DATEPART(tz,SYSDATETIMEOFFSET())));
Wynik konwersji '2013-11-21 00: 00: +00,0000000 -00: 00' do DateTime na serwerze, który jest offsetowej -7: 00 będzie 2013-11-20 17:00 : 00.000. Z powyższą logiką nie ma znaczenia strefa czasowa serwera lub przesunięcie wartości DateTime, zostanie ona przekonwertowana na DateTime w strefie czasowej serwera.
Uważam, że należy to zrobić, ponieważ wartość DateTime zawiera założenie, że wartość znajduje się w strefie czasowej serwera.
Czy można wyjaśnić, co znaczy ostatni argument "1" CONVERT? Wszystkie przykłady tego argumentu używają typów znaków jako typu wyjściowego lub wejściowego. Tutaj konwertujemy datetimeoffset na datetime. –
Funkcja 'convert()' pobiera trzeci parametr określający format wyjścia. [https://www.w3schools.com/sql/func_convert.asp](https://www.w3schools.com/sql/func_convert.asp). 1 = "mm/dd/rr" format –
Trzeci argument nie ma żadnego sensu dla konwersji z 'datetimeoffset' na' datetime2'. Dotyczy konwersji "varchar'. https://docs.microsoft.com/en-us/sql/t-sql/functions/cast-and-convert-transact-sql (również W3Schools? tak wiele lepszych opcji teraz!) – brianary