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字段,我无能为力。
答案 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)
您必须根据错误输入字段中的日期格式查找哪一个。