我有自定义表,它在几天内规定了保留记录的时间。我需要知道如何将变量传递给BETWEEN语句,以便只返回今天包含的变量 - 变量。
WHERE (MessageDate BETWEEN GETDATE() AND DATEADD(day, DATEDIFF(day, 0, GETDATE()), - 7))
在这种情况下,-7将是从今天开始的7天,并且是我传入的参数。
答案 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()