【问题标题】:How can I use SQL BETWEEN to compare two dates in a string to execute to sp_executesql?如何使用 SQL BETWEEN 比较字符串中的两个日期以执行 sp_executesql?
【发布时间】:2012-03-27 19:07:37
【问题描述】:

我的 SQL 存储过程中有一行看起来像这样(按预期工作):

HAVING  oh.startdate BETWEEN @startDate AND @endDate

但是,再往下我有一行:

AND (oh.user IN (@userIDs))

@userIDs 是一个逗号分隔的 ID 字符串,而 oh.user 是一个 INTEGER,所以我实际上必须将整个 SQL 查询放入一个动态字符串 (@sql) 中,并将所有参数连接到其中,然后使用

sp_executesql @sql 

除了 BETWEEN 日期外,一切正常,我尝试了几种方法,但一直收到错误或没有返回任何结果:

    HAVING  oh.startdate BETWEEN CONVERT(DATETIME, '+LEFT(CONVERT(VARCHAR, @startDate, 120), 10)+', 120) AND CONVERT(DATETIME, '+LEFT(CONVERT(VARCHAR, @endDate, 120), 10)+', 120)

什么都不返回。

    HAVING  oh.startdate '+LEFT(CONVERT(VARCHAR, @startDate, 120), 10)+' AND '+LEFT(CONVERT(VARCHAR, @endDate, 120), 10)+'

也不返回任何内容。

    HAVING  oh.startdate BETWEEN ' + @startDate +' AND '+ @endDate +'

返回将 DATETIME 转换为字符串的错误。

感谢任何帮助。

谢谢, 托马斯

【问题讨论】:

  • 您能否发布您的整个查询、一些示例数据和您的预期结果?
  • oh.startdate、@startDate 和@endDate 使用什么类型?
  • 并告诉我们使用的日期格式。 (例如:'21-jan-20012' 或 '21/01/2012')
  • @FrancisP 感谢您的输入,下面的答案非常有效。
  • @bluefeet 感谢您的意见,下面的答案非常有效。

标签: sql sql-server stored-procedures type-conversion sp-executesql


【解决方案1】:

你可以使用sp_executesql并传递你想要的参数:

SET @sql = 'SELECT blabla FROM Table WHERE Something HAVING oh.startdate BETWEEN @startDate AND @endDate'
EXEC sp_executesql @sql,N'@startDate DATE, @EndDate DATE',@startDate, @EndDate

【讨论】:

  • 哇。我不知道你能做到这一点。非常感谢!像魅力一样工作。
【解决方案2】:

试试这个:

HAVING  oh.startdate BETWEEN to_date(@startDate,'dd-MM-yyyy') AND to_date(@endDate,'dd-MM-yyyy')

并更改“dd-MM-yyyy”以适合您使用的日期格式。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-15
    • 1970-01-01
    • 2013-10-31
    • 1970-01-01
    • 2013-01-24
    • 1970-01-01
    相关资源
    最近更新 更多