1

如果给定变量是日期,我使用此命令选择所有特定日期,如果不是,则应返回所有字段。

这些命令@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可以是任何字符串,例如。“2013 年 1 月 1 日”、“随机”、“3”。

@query如果不是日期形式,该命令应返回所有字段。

4

1 回答 1

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

sqlfiddle 上的演示。

问题是逻辑运算符在 SQL 中没有短路,因此优化器将CONVERT(date, @query)其视为可以预先计算以加快查询速度的东西。通过将条件扩展为CASE完全取决于您可以在返回“false”时@query消除CONVERT分支的执行。ISDATE(@query)

于 2013-06-21T15:17:56.720 回答