Что не так с этим использованием try_convert?

Я пытаюсь использовать новую функцию try_convert в mssql2012 для преобразования строки даты/времени/смещения в datetimeoffset.

Строка выглядит так: 2013-04-25T21:56:58.077-05:00

Вот код - я знаю, что этот синтаксический анализ не будет работать, поэтому я ожидал, что результат попадет в «IS NULL» и вернет «Cast Failed». Это не то, что произошло - вместо этого я все еще получаю сообщение об ошибке преобразования даты Msg 241. Любые идеи?

case  
   when try_convert(datetimeoffset, (cast(substring(lift.PlannedLiftDateTime,1,10) + ' ' + substring(lift.PlannedLiftDateTime,12,8) + ' ' + substring(lift.PlannedLiftDateTime,20,6) as datetimeoffset))) IS NULL
    then 'Cast Failed'
   when ltrim(rtrim(lift.PlannedLiftDateTime)) = ''
    then NULL
   else
    '~' + lift.PlannedLiftDateTime + '~'
end as PlannedLiftDateTime,

person plditallo    schedule 03.05.2013    source источник
comment
Откуда вы знаете, что ошибка не исходит из другой части вашего оператора SQL?   -  person RBarryYoung    schedule 04.05.2013
comment
@RBarryYoung Я получаю ту же ошибку, если пытаюсь использовать sqlfiddle: sqlfiddle.com/#!6/d41d8 /3912   -  person Lamak    schedule 04.05.2013


Ответы (1)


Вы получаете сообщение об ошибке из-за оператора CAST внутри, try_convert - try_convert не будет потреблять все ошибки, которые вы генерируете, он просто вернет NULL, если ваше преобразование не удастся.

Если вы используете try_convert для обеих попыток, это сработает:

when try_convert(datetimeoffset, (try_convert(datetimeoffset, substring(@DateString,1,10) + ' ' + substring(@DateString,12,8) + ' ' + substring(@DateString,20,6)))) IS NULL

Рабочая скрипка вашего кода здесь.

person JNK    schedule 03.05.2013
comment
примерно в то время, когда вы опубликовали это, я только что снял гипс! :) Ха! Конечно, он проверяет правильно... теперь, когда мы разобрались с проблемой "plditallo"! :) - person plditallo; 04.05.2013
comment
Спасибо всем! извините за вторжение. - person plditallo; 04.05.2013