SQL日期范围使用动态参数

时间:2014-01-27 14:49:19

标签: sql-server tsql

我有自定义表,它在几天内规定了保留记录的时间。我需要知道如何将变量传递给BETWEEN语句,以便只返回今天包含的变量 - 变量。

WHERE (MessageDate BETWEEN GETDATE() AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), - 7))
在这种情况下,

-7将是从今天开始的7天,并且是我传入的参数。

2 个答案:

答案 0 :(得分:1)

您不需要DATEDIFF功能,只能使用DATEADD,您可以找到正确的参数顺序here

因此,您的WHERE子句可能如下所示:

DECLARE @parameter INTEGER
SET @paramenter = -7
...
WHERE
    (MessageDate BETWEEN GETDATE ()
                     AND DATEADD(day, @parameter, GETDATE())
    )

这是SQLFiddle。 (更新小提琴)

修改

此外,查询的BETWEEN部分应首先使用较旧的日期(DATEADD(day, -7, GETDATE()),然后使用较新的日期(GETDATE())。

这就是为什么,如果你总是要传递一个负参数,你将不得不在WHERE子句中切换日期的顺序并使用它们:

WHERE
    (MessageDate BETWEEN DATEADD(day, @parameter, GETDATE()
                 AND GETDATE())
    )

但是,如果您可能必须传递正面和负面参数,请使用:

WHERE
    (MessageDate BETWEEN DATEADD(day, @parameter, GETDATE()
                 AND GETDATE())
     OR
     MessageDate BETWEEN GETDATE ()
                     AND DATEADD(day, @parameter, GETDATE())
    )

使用OR,您将覆盖两个案例,即发送正参数的案例和发送负参数的案例。

这些情况是互斥的,因此只有一个条件会返回结果。

答案 1 :(得分:1)

GETDATE()的替代导致DAYS,因此您可以使用以下内容:

DECLARE @param INTEGER
SET @param = 7
--
WHERE cast(MessageDate as datetime) >= GETDATE()- @param
      AND  cast(MessageDate as datetime)<= GETDATE()