我正在尝试从表中查询SOE列(datetime字段)和Answer列(varchar字段),其中并非ALL Answer值是日期,但其中一些是日期。如果我从“ where”子句中删除了datediff,我就可以运行查询了。但是在包含它时,它会错误地指出“从字符串转换日期和/或时间时转换失败” 。
对于上下文,我正在使用SQL Server 2014。
这是我的查询内容:
CLSIDFromProgID
任何解决此问题的技巧将不胜感激。
答案 0 :(得分:3)
在转换为日期时间之前,请确保“答案”字段中的数据可以转换为日期。试试这个...
and ((isdate(Answer) = 1) and (datediff(dd, convert(datetime, Answer, 121), SOE) <= 5))
答案 1 :(得分:1)
从2012年开始,您可以使用try_convert()
。
...
datediff(dd, try_convert(datetime, Answer, 121), SOE) <= 5
...
如果转换失败, try_convert()
返回NULL
。然后datediff()
也是如此。因此,您可能希望以某种方式处理这种情况。
答案 2 :(得分:0)
使用apply
可以为自己保存一些重复的代码:
select ID,
answer_datetime as Answer,
datediff(day, answer_datetime, SOE) as Days
from table t cross apply
(values (try_convert(datetime, Answer, 121))) v(answer_datetime)
where Type in (1) and
SOE between '2019-01-01' and '2019-03-31' and
FormLocation = 'M1005_INP_DISCHARGE_DT' and
PayorType = 'Medicare' and
Answer <> ' ' and
datediff(day, answer_datetime, SOE) <= 5;
但是您应该真正修复数据定义,以便使用正确的类型存储日期/时间。