从字符串转换datetime时,另一个转换失败

时间:2012-10-23 16:22:52

标签: sql sql-server

SELECT Asset.AssetID, AnsMaint.Answer, Convert(datetime, AnsMaint.Answer) as maintasdate
FROM Asset INNER JOIN 
AssetAnswer AnsMaint ON AnsMaint.AssetID = Asset.AssetID INNER JOIN  
AssetField FldMaint ON FldMaint.AssetFieldID = AnsMaint.AssetFieldID 
WHERE FldMaint.FieldText = 'Maint. Agreement Term' 
AND ISDATE(AnsMaint.Answer) = 1 
AND Convert(datetime, AnsMaint.Answer) < DateAdd(d, 145, GetDate())

我在AND的最后部分得到了错误。如果我评论AND出来,它工作正常。我在DB的日期恰好是10/10/2012并且有效。 IsDate应该清除任何无效的东西。

在DB中结果(当我注释掉最后一行时)。我完全难过了。

106 10/10/2012  2012-10-10 00:00:00.000
115 10/10/2012  2012-10-10 00:00:00.000

更有趣的花絮。如果我将最后一行AND行更改为

AND DateAdd(d, cast(Asset.MaintenanceFreq as int), Convert(datetime, AnsMaint.Answer)) < DateAdd(d, 45, GetDate()) 

它有效。如果我取出第二个参数(强制转换为int)并用数字或零替换它,它会给我同样的错误。

我很难过。任何帮助都会非常感激!

哦,AssetMaint.Answer是数据库中的varchar字段,我无能为力。

2 个答案:

答案 0 :(得分:1)

从描述中,听起来像Answer列包含一些无法转换为日期的记录的值,而SQL正在选择一个执行计划,该计划在ISDATE之前评估CONVERT。

请尝试使用CASE语句进行转换:

WHERE FldMaint.FieldText = 'Maint. Agreement Term' 
AND CASE ISDATE(AnsMaint.Answer) 
   WHEN 1 THEN Convert(datetime, AnsMaint.Answer, 103) 
END < DateAdd(d, 145, GetDate())

答案 1 :(得分:0)

这是一个猜测,但我会说这是mm / dd / yyyy与dd / mm / yyyy。 例如10/10可以,但20/10或10/20可能不是。

将样式参数添加到转换中,例如

Convert(datetime, AnsMaint.Answer,103)

您必须根据错误输入字段中的日期格式查找哪一个。