我在视图中有一个日期时间列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()
也无效。它是否与视图中的数据而不是表格有关?
答案 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()
字符串比较就足够了。