比较字符串日期到日期时间

问题描述:

我有一个存储过程,需要一个字符串参数的日期。 。在外观来与数据库中的日期为保存形式2012-02-26 06:00:00.000(时间是附属于他们的形式yyyy-MM-dd的数据当我运行SQL它始终没有返回值,因为它无法找到一个比较:比较字符串日期到日期时间

'select t_typday from ' + @dbName+ '.dbo.Calendar ' + 
' where T_date LIKE ''' + @dateFilter + '%'''; 
+2

您存储日期时间值_strings _ ??? – Oded 2012-04-23 14:40:35

+1

更重要的问题是:为什么你根据日期时间字段传递字符串?相反,使用类型为“datetime”的参数(恐怕你也可以打开SQL注入)。 – 2012-04-23 14:41:06

+0

会解决我的比较问题吗? – 2012-04-23 14:42:11

您需要将日期转换在表中的yyyy-mm-dd hh:mi:ss.mmm日期。在comparin之前的格式使用LIKE该格式的字符串参数g它:

要解决以最小的改变现有代码,改变T_dateCONVERT(VARCHAR(50),T_date,121),生产:

'select t_typday from ' + @dbName+ '.dbo.Calendar ' + 
' where CONVERT(VARCHAR(50),T_date,121) LIKE ''' + @dateFilter + '%'''; 

如果不执行转换,你是比较一个本地格式字符串(基于@@LANGUAGE设置),如Apr 12 2012 12:00AM与您的@dateFilter字符串包含,例如,2012-04-12。这就是为什么比较不起作用。

当然,将DATE类型的参数传入存储过程将会是一个更好的解决方案,因为有几条评论已经提到。这将使你在@dateFilter比较日期T_dateDATE值传递使用一个简单的表达,如:

CONVERT(DATE,T_date)[email protected] 
+0

如何将这个动态sql更改为@dateFilter作为日期时间? – 2012-04-23 14:54:24

+0

您可以通过'CONVERT(DATETIME,@ dateFilter)'在存储过程中进行转换,或者只是将存储过程本身中的参数类型更改为类型'DATETIME'而不是'VARCHAR(50)'或者其他任何是。如果您只想将日期作为过滤器,请将参数设置为“DATE”类型的存储过程,然后使用简单的“CONVERT(DATE,T_date)= @ dateFilter”进行比较。 – 2012-04-23 14:55:19

你需要使用一个明确的日期格式 - 这一点不能被解释为几个可能的日期

见选项thisthis