我正在尝试获取上次更新日期早于当前日期减去x个月的数据列表。
例如,这是一个示例表:
| DataGUID | UpdateDate |
|------------|---------------|
| AAA | 12-05-2017 |
| BBB | 22-06-2017 |
| AAA | 14-02-2017 |
| BBB | 16-05-2017 |
目前,我的SQL请求与以下内容类似:
SELECT
DataGUID,
MAX(UpdateDate)
FROM
Table
GROUP BY
DataGUID
HAVING
MAX(UpdateDate) <= DATEADD(mm, CAST('-'+@LastUpdatedXMonthAgo AS INT), GETDATE())
ORDER BY
MAX(UpdateDate) DESC;
预期结果如下(@LastUpdatedXMonthAgo = 1,当前日期为13-07-2017):
| DataGUID | UpdateDate |
|------------|---------------|
| AAA | 12-05-2017 |
它适用于SSMS,但SSRS似乎忽略了“having”子句,并给出了这个结果:
| DataGUID | UpdateDate |
|------------|---------------|
| BBB | 22-06-2017 |
| AAA | 12-05-2017 |
似乎SSRS只是忽略了“having”子句,有没有办法让它在不使用SSRS过滤器的情况下工作?
答案 0 :(得分:5)
问题似乎是您尝试将连字符连接到会话变量(这是一个数字)。这导致忽略/删除减号。因此,您的HAVING
条款 正在运作,但它将从现在开始比较每个最大日期与未来一个月,而不是一个月。
以下查询将向您展示解决此问题的一种方法:
DECLARE @LastUpdatedXMonthAgo INT;
SET @LastUpdatedXMonthAgo = 1;
SELECT
DATEADD(mm, CAST('-'+CAST(@LastUpdatedXMonthAgo AS VARCHAR(55)) AS INT), GETDATE());
这种方法是在试图“否定”字符串之前将@LastUpdatedXMonthAgo
转换为文本。另一种方法是只生成@LastUpdatedXMonthAgo
文本,但这可能对您的其余脚本不方便。
<强>更新强>
在SSMS中,我们可以进一步简化为:
DATEADD(mm, -@LastUpdatedXMonthAgo, GETDATE());
在这里演示: