日期转换在where子句中不起作用

时间:2019-01-23 00:19:39

标签: sql sql-server type-conversion date-conversion

我正在尝试从表中查询SOE列(datetime字段)和Answer列(varchar字段),其中并非ALL Answer值是日期,但其中一些是日期。如果我从“ where”子句中删除了datediff,我就可以运行查询了。但是在包含它时,它会错误地指出“从字符串转换日期和/或时间时转换失败”

对于上下文,我正在使用SQL Server 2014。

这是我的查询内容:

CLSIDFromProgID

任何解决此问题的技巧将不胜感激。

3 个答案:

答案 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;

但是您应该真正修复数据定义,以便使用正确的类型存储日期/时间。