首页 > 解决方案 > 忽略 CAST 错误

问题描述

我有两个领域

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

其中包含格式为 hh:mm:ss 的值。

我需要在几秒钟内找到两个字段之间的差异,当数据格式正确时,这可以正常工作。一些数据的格式不正确,当我尝试将其转换为整数时,我收到错误消息“将 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

标签: sqlsql-serversql-server-2012

解决方案


您没有提供示例数据和所需的结果,但您的代码看起来比需要的复杂得多。

如果我能在几秒钟内得到差异,我会简单地做:

   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

推荐阅读