在我的表中,我有一个名为logDate的日期时间空字段。存储格式: 2014-03-28 12:24:00.000
我有一个表单,日志日期是搜索日志的字段之一。用户将输入日期,如 2014-03-28
所以在我的选择过程中,我需要使用 LIKE:
@logDate datetime =NULL
.
.
SELECT .. FROM mytable WHERE
(@logDate IS NULL OR CONVERT(VARCHAR, @logDate, 102) LIKE '%'+logDate+'%')
我执行程序:
EXEC dbo.SELECT_mytable @logDate= '2014-03-28'
但是我收到以下错误:
从字符串转换日期和/或时间时转换失败。
我做错了什么?
您还需要将 logdate 列转换为 varchar,我认为您在尝试在日期列中查找用户输入的日期时有错误的方式,因此请尝试:
SELECT .. FROM mytable WHERE
(@logDate IS NULL
OR '%'+CONVERT(VARCHAR, @logDate, 102)+'%' LIKE CONVERT(VARCHAR, logDate, 102))
正如其他人所指出的(我应该指出)您不应该为了搜索日期列而将日期转换为字符串,最好将所有内容都保留为 DateTime 格式以提高性能。
只要将存储过程更改为将 @logDate 参数作为 DateTime,这将起作用:
SELECT .. FROM mytable WHERE
(@logDate IS NULL
OR logDate = @logDate)
我的印象是,您走上了字符串比较路线,因为您想忽略时间元素而只搜索日期,如果是这种情况,您可以从两个元素中剥离时间并通过这样做来匹配日期:
IF @logDate IS NOT NULL
BEGIN
// Remove any time element
SET @logDate = DATEADD(dd,0, DATEDIFF(dd,0,@logDate))
END
SELECT .. FROM mytable WHERE
(@logDate IS NULL
OR DATEADD(dd,0, DATEDIFF(dd,0,logDate)) = @logDate)