2
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 注释掉,它可以正常工作。我在数据库中的日期恰好是 10/10/2012 并且有效。IsDate 应该清除任何无效的内容。

在数据库中的结果(当我注释掉最后一行时)。我完全被难住了。

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 字段,对此我无能为力。

4

2 回答 2

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())
于 2012-10-23T16:35:32.537 回答
0

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

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

Convert(datetime, AnsMaint.Answer,103)

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

于 2012-10-23T16:32:38.497 回答