SSRS并忽略“有”条款

时间:2017-07-05 08:27:03

标签: sql-server tsql reporting-services

我正在尝试获取上次更新日期早于当前日期减去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过滤器的情况下工作?

1 个答案:

答案 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());

在这里演示:

Rextester