如何在每月的第 6 个工作日开始订阅 SSRS

How to make SSRS subscriptions Kick off on Business Day 6 of month

发现了一个类似的问题 但在那种情况下,建议并接受了解决方法 - 每月 1 日的时间表 - 作为答案。

我想知道是否有人找到了在指定工作日进行 SSRS 订阅的巧妙方法 运行。 I.E 运行 在第 6 个工作日。这不仅是为了防止报告在周末外出,而且还因为与关闭月份相关的某些财务操作有一个商定的日期(例如。“将由BD 3") 之后每个月我都需要向 运行 报告。

一条评论还建议设置一个 sql 代理工作来计算每个月的 BD X,并在该日期插入一个 SQL 工作以启动报告。我可以在理论上看到这是如何工作的——但是订阅不会在 SSRS 中管理,并且将来很容易被忽视。

我一直在使用以下不完善的代码:

--: returns last day of last month (DT), but only provides a result row if we are on BusinessDay X of the month.
--No rows returned prevents the report from being processed & sent. 
--SSRS Schedule must be set to run monthly in a range covering all possible Calendar Days that could be Business Day X 
declare @dt datetime = Getdate(), @BDTarget int = 6
SELECT DATEADD(MONTH, DATEDIFF(MONTH, -1,@dt)-1, -1) as DT,sum(dimdate.BusinessDay) as BD
FROM DimDate 
where FullDate between  DATEADD(mm, DATEDIFF(mm, 0, @dt), 0) and @dt
having sum(dimdate.BusinessDay)=@BDTarget

虽然最近发现此逻辑可以连续两天启动报告,例如,如果我们正在寻找 BD 6,本月 2021 年 7 月,上述查询在 7 月 9 日星期五和星期六都返回了一行7/10.

您可以使用每天运行的数据驱动订阅。 使用仅在第 6 个工作日给出结果的查询。

例如

WITH cte_6th
AS
(
    SELECT *
    FROM dimDate dd
    WHERE dd.TheMonth = MONTH(current_timestamp)
    AND dd.TheYear = YEAR(current_timestamp)
    AND dd.BusinessDay = 1
    ORDER BY dd.Date
    OFFSET 5 ROWS
    FETCH NEXT 1 ROWS ONLY
)
SELECT *
FROM cte_6th c
WHERE c.Date = CAST(current_timestamp as DATE);