2014-11-21 4 views
1

Я пытаюсь использовать команду SQL CONVERT для преобразования VARCHAR в DATETIME в SQL Server 2012. Я следую инструкциям, и я хочу использовать дату/форматы времени, описанные на этой странице MSDN: http://msdn.microsoft.com/en-us/library/ms187928.aspxОшибка преобразования VARCHAR в DATETIME в SQL (с часовым поясом)

Основываясь на этом, формат # 127 описывается следующим образом:

  • ISO8601 with time zone Z.
  • yyyy-mm-ddThh:mi:ss.mmmZ (no spaces)
  • When the value for milliseconds (mmm) is 0, the millisecond value is not displayed. For example, the value '2012-11-07T18:26:20.000 is displayed as '2012-11-07T18:26:20'.
  • The optional time zone indicator, Z, is used to make it easier to map XML datetime values that have time zone information to SQL Server datetime values that have no time zone. Z is the indicator for time zone UTC-0. Other time zones are indicated with HH:MM offset in the + or - direction. For example: 2006-12-12T23:45:12-08:00.

Однако, когда я пытаюсь фактически сделать преобразование (после этого формата), он терпит неудачу ...

SELECT CONVERT(datetime, '2014-07-14T10:00:00.000-08:00', 127) 

... со следующей ошибкой:

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

Кто-нибудь знает, почему это не работает?

EDIT: пример не работает, либо:

SELECT CONVERT(datetime, '2006-12-12T23:45:12-08:00', 127) 

Msg 241, Level 16, State 1, Line 1
Conversion failed when converting date and/or time from character string.

ответ

1

Поскольку это строка с часового пояса в нем, вам нужно преобразовать его к типу DATETIMEOFFSET:

SELECT CONVERT(DATETIMEOFFSET, '2014-07-14T10:00:00.000-08:00', 127) 

(No column name) 
---------------------------------- 
2014-07-14 10:00:00.0000000 -08:00 

Это работает отлично. После этого вы можете преобразовать его в локальный DATETIME по мере необходимости, например. с

DECLARE @DateTimeOffset DATETIMEOFFSET 
CAST(@DateTimeOffset AS DATETIME) 

или переключая значение в другой часовой пояс с

SELECT SWITCHOFFSET(@DateTimeOffset, '+01:00') 
+0

Это сработало, спасибо! Думаю, мне нужно было продолжать читать сноски: -x –

Смежные вопросы