从视图中的字符串转换日期和/或时间时转换失败

时间:2017-10-08 12:44:02

标签: sql sql-server date datetime sql-server-2016

我在视图中有一个日期时间列TAR_DATE,日期格式为yyyy-mm-dd hh:mi:ss.mmm,我读的是standard format for ODBC canonical

我需要将此TAR_DATE列与另一个日期进行比较:

select count(1) 
from db_view 
where (case 
          when isdate(TAR_DATE) = 1 
             then convert(datetime, TAR_DATE, 121)               
      end) <= convert(datetime, '2016-08-25', 121)

以上查询引发错误:

  

从字符串转换日期和/或时间时转换失败。

然而,如下所示单独执行转换工作正常:

select 
    (case
        when isdate(TAR_DATE) = 1 
           then convert(datetime, TAR_DATE, 121) 
     end) 
from 
    db_view 

select convert(datetime, '2016-08-25', 121)

造成这种情况的原因是什么?

使用try_convert()也无效。它是否与视图中的数据而不是表格有关?

2 个答案:

答案 0 :(得分:3)

优化程序可以按意外顺序评估case语句。它可以决定首先评估then分支,并仅在满足when条件时使用其结果。令人惊讶的是,对于不希望执行then条件的行,您可能会收到错误。

使用try_convert可以防止出现此问题,并且更容易阅读:

wehre  try_convert(datetime, TAR_DATE, 121) <= '2016-08-25'

如果转换失败,try_convert会返回null而不是引发错误。

答案 1 :(得分:0)

您应该使用$Error = new Error(); 。但是,如果该值是ISO标准YYYY-MM-DD。 。 。格式,然后你甚至不需要转换:

try_convert()

字符串比较就足够了。