Sql 从字符串转换日期时间时,另一个转换失败

Sql 从字符串转换日期时间时,另一个转换失败,sql,sql-server,Sql,Sql Server,更有趣的花絮。如果我把最后一行改成 106 10/10/2012 2012-10-10 00:00:00.000 115 10/10/2012 2012-10-10 00:00:00.000 和DateAdd(d,cast(Asset.MaintenanceFreq as int),Convert(datetime,AnsMaint.Answer))

更有趣的花絮。如果我把最后一行改成

106 10/10/2012  2012-10-10 00:00:00.000
115 10/10/2012  2012-10-10 00:00:00.000
和DateAdd(d,cast(Asset.MaintenanceFreq as int),Convert(datetime,AnsMaint.Answer))
它起作用了。如果我取出第二个参数(强制转换为int)并用一个数字或零替换它,它会给出相同的错误

我被难住了。任何帮助都将不胜感激


哦,AssetMaint。答案是DB中的一个varchar字段。对此我无能为力。

这是一个猜测,但我会说是mm/dd/yyyy与dd/mm/yyyy。 e、 g.10/10可以,但20/10或10/20可能不行

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

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

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

根据描述,答案列似乎包含一些无法转换为日期的记录的值,SQL正在选择一个执行计划,该计划在ISDATE之前对转换进行评估

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

Convert(datetime, AnsMaint.Answer,103)
其中FldMaint.FieldText='Maint。协议期限'
和案例数据(AnsMaint.答案)
当1转换时(日期时间,AnsMaint.Answer,103)
END
我想用SQL方言说,这是SQL Server,但OP可以澄清这一点。“我在和的最后一部分得到了错误”。错误消息是什么?是的,这是SQLServer对不起。错误消息是:从字符串转换日期时间时转换失败。关于
ISDATE()
“剔除”非日期值的注意事项-SQL并不像命令式语言那样真的做短路逻辑;优化器可以根据自己的需要重新安排事情。太棒了!那么SQL可以“选择”执行计划的顺序?这有点让人发疯。
Convert(datetime, AnsMaint.Answer,103)
WHERE FldMaint.FieldText = 'Maint. Agreement Term' 
AND CASE ISDATE(AnsMaint.Answer) 
   WHEN 1 THEN Convert(datetime, AnsMaint.Answer, 103) 
END < DateAdd(d, 145, GetDate())