比较日期列表

时间:2014-01-23 20:25:57

标签: sql vb.net ado.net

在我的SQL WHERE caluse中,我正在检查Report Date是否在我传递给SQL存储过程的日期列表中。

WHERE REPORT_RUN_DATE IN (@REPORT_RUN_DATES)

让我们说@REPORT_RUN_DATE等于'11 / 09/2013'

那不匹配(没有返回记录)所以那么,看一下比较,我正在将日期字段与已经转换为字符串的日期进行比较,然后再传递给存储过程。所以我试过了。

WHERE CONVERT(VARCHAR, REPORT_RUN_DATE, 101) IN (@REPORT_RUN_DATES)

同样的问题。没有比赛。没有记录返回。日期作为字符串传递的原因可能有时我将在多个日期传递,例如''11/09/2013','11/14/2013''这就是我使用IN子句的原因。我们不存储日期的任何时间部分,因此我只处理日期数据类型而不是datetimesmalldatetime

我发现在T-SQL中使用IN CLAUSE的大多数示例都与integersstrings有关,但与dates无关。我正在使用VB.Net 2012通过ADO.NET传递我的参数。单步执行我的代码我知道值正确传递并且值应返回结果集。

任何关于如何进行的建议将不胜感激......

1 个答案:

答案 0 :(得分:0)

你不能只传递多个这样的值。您最终将字符串作为单个值传递,然后SQL会将日期列作为字符串与传入的值进行比较:

以下是一些选项:

  • 使用多个日期参数(2?,3?)
  • 为存储过程创建表值参数类型
  • 使用不同的日期多次调用sproc(在VB代码中循环)
  • 在VB中生成SQL而不是调用sproc(需要谨慎注入SQL)
  • 反转比较并使用LIKE

     WHERE @REPORT_RUN_DATES LIKE '%' + CONVERT(DATE, REPORT_RUN_DATE, 101) + '%'