如果给定变量是日期,我使用此命令选择所有特定日期,如果不是,则应返回所有字段。
当@query
采用日期形式时,命令有效,但会返回错误:
“从字符串转换日期和/或时间时转换失败。”
当它是任何其他任意字符串时。
代码:
select * from table where
format(dateofbirth,'dd/MMM/yyyy') = Case
when ISDATE(@query)=1 then
format(CONVERT(datetime,@query),'dd/MMM/yyyy')
else
format(dateofbirth,'dd/MMM/yyyy')
修改
@query
可以是例如的任何字符串。 “1/1/2013”,“随机”,“3”。
如果@query
不是日期形式,该命令应返回所有字段。
答案 0 :(得分:1)
您可以通过重新制定查询条件来解决此问题,如下所示:
declare @query as varchar(20)='blah'
SELECT *
FROM testtable
WHERE ISDATE(@query) = 0
OR CONVERT(date, dateofbirth) = CASE ISDATE(@query)
WHEN 1 THEN CONVERT(date, @query) ELSE NULL
END
问题是逻辑运算符在SQL中没有短路,因此优化器将CONVERT(date, @query)
视为可以预先计算以加速查询的内容。通过将条件扩展为完全取决于CASE
的{{1}},您可以在@query
返回“false”时消除CONVERT
分支的执行。