Игнорировать ошибку с CAST - PullRequest
0 голосов
/ 14 мая 2018

У меня есть два поля

CallLength(varchar(10)) and 
CallLengthActual(varchar(10)) 

, которые содержат значения в формате чч: мм: сс.

Мне нужно найти разницу между двумя полями в секундах, которая прекрасно работает, когда данные отформатированы правильно.Некоторые данные отформатированы неправильно, и когда я пытаюсь привести их к целому числу, я получаю сообщение об ошибке «Преобразование не удалось при преобразовании значения varchar 'x' в тип данных int".

Есть ли способ просто игнорировать данные, которые отформатированы неправильно?Я использую SQL Server 2012, и в документах говорится, что TRY_CAST поддерживается, но, похоже, он не работает с моей версией.

(CAST((SUBSTRING([CallLength],0,(CHARINDEX(':',[CallLength],0)))*3600)+(LEFT(RIGHT([CallLength],5),2)*60)+RIGHT([CallLength],2) AS int) -
CAST((SUBSTRING([CallLengthActual],0,(CHARINDEX(':',[CallLengthActual],0)))*3600)+(LEFT(RIGHT([CallLengthActual],5),2)*60)+RIGHT([CallLengthActual],2) AS Int)) AS Variance

1 Ответ

0 голосов
/ 14 мая 2018

Вы не предоставляете пример данных и желаемых результатов, но ваш код выглядит намного сложнее, чем нужно.

Если бы я получал разницу в секундах, я бы просто сделал:

   datediff(second,
            try_convert(time, CallLengthActual),
            try_convert(time, CallLength)
           ) as diff_seconds

Это может быть негативом того, что вы хотите.Я не уверен, из чего вы вычитаете.

Если try_convert() не работает, то ваш уровень совместимости установлен на более старую версию.Вы можете довольно близко подойти к isdate():

   datediff(second,
            (case when isdate(CallLengthActual) = 1 then convert(time, CallLengthActual end),
            (case when isdate(CallLength) = 1 then convert(time, CallLength) end)
           ) as diff_seconds
...