2014-04-01 66 views
1

在我的表中,我有一个日期时间空字段称为logDate。 存储的格式:2014-03-28 12:24:00.000SQL Server 2012错误转换日期从字符串选择日期时如

我有一个窗体,日志日期是搜索日志的字段之一。 用户将因此在我的SELECT程序进入像2014年3月28日

日期我需要使用,如:

@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' 

但我得到以下错误:

Conversion failed when converting date and/or time from character string.

我在做什么错?

+1

你为什么不使用之间有日期时间值代替,或者只是转换为“日期”?尽可能避免字符串转换... –

+0

不是事件他字符串转换,是谓词[SARGability](http://en.wikipedia.org/wiki/Sargable)。通过在日期使用LIKE,任何使用索引范围扫描的希望都被抛出,查询将保证进行完整的端到端扫描。 –

+0

DATETIME和DATE数据类型不以任何格式存储。你看到的格式是各种东西的产品,如客户端工具,语言等。 –

回答

2

你还需要将LOGDATE列转换为varchar,我觉得你有你喜欢走错了路周围,你正在努力寻找日期列中的用户输入的日期,所以尝试:

SELECT .. FROM mytable WHERE 
    (@logDate IS NULL 
    OR '%'+CONVERT(VARCHAR, @logDate, 102)+'%' LIKE CONVERT(VARCHAR, logDate, 102)) 

正如其他人指出的那样(我应该指出),为了搜索日期列,您不应该将日期转换为字符串,更好的方式是将所有内容保留为日期时间格式以提高性能。

这将工作,只要你改变你的存储过程来期待@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) 
+0

非常感谢你! – lleoun

+0

你应该比较日期不是字符串。 – Kaf

+0

@卡夫同意看到更新的答案 – CSL

相关问题