You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何配置SSRS数据驱动订阅在每月第3个工作日触发

实现SSRS每月第3个工作日触发数据驱动订阅

优化后的SQL:获取每月第3个工作日

从你的日历表中精准提取每年每个月的第3个工作日,用窗口函数ROW_NUMBER()给每月的工作日排序,逻辑更简洁清晰:

WITH MonthlyWorkdays AS (
    SELECT 
        date,
        year,
        MONTH(date) AS month,
        -- 按年、月分组,给当月工作日按日期排序编号
        ROW_NUMBER() OVER (PARTITION BY year, MONTH(date) ORDER BY date) AS WorkdayRank
    FROM Company.dbo.Company_Calendar
    WHERE 
        day_of_week NOT IN (1,7) -- 排除周末(假设1=周日、7=周六,可根据你的实际定义调整)
        AND date <> '1900-01-01' -- 过滤无效日期
)
SELECT 
    year,
    month,
    date AS ThirdWorkdayOfMonth
FROM MonthlyWorkdays
WHERE WorkdayRank = 3
-- 如需限定当前年,可添加 AND year = YEAR(GETDATE())

触发订阅的判断逻辑

要让SSRS仅在当天是当月第3个工作日时执行订阅,你可以编写如下SQL作为数据驱动订阅的数据源:

DECLARE @Today DATE = GETDATE();

-- 检查当天是否是当月第3个工作日
IF EXISTS (
    SELECT 1
    FROM (
        SELECT 
            date,
            ROW_NUMBER() OVER (PARTITION BY year, MONTH(date) ORDER BY date) AS WorkdayRank
        FROM Company.dbo.Company_Calendar
        WHERE 
            day_of_week NOT IN (1,7)
            AND date <> '1900-01-01'
            AND year = YEAR(@Today)
            AND MONTH(date) = MONTH(@Today)
    ) AS MonthlyWorkdays
    WHERE WorkdayRank = 3 AND date = @Today
)
BEGIN
    -- 此处返回订阅所需的收件人信息(替换为你的实际收件人表查询)
    SELECT 
        Email AS [To],
        FullName AS [DisplayName]
    FROM YourRecipientTable; -- 替换为你的收件人表名称
END
ELSE
BEGIN
    -- 返回空结果集,SSRS会因无数据跳过本次订阅发送
    SELECT 1 WHERE 1 = 0;
END

原有SQL的问题说明

  1. 存在重复的year = 2023条件,属于冗余写法;
  2. 注释中的CASE语句语法错误,判断多个值应使用IN而非=加括号;
  3. day_weekday_ct = 1的条件不符合需求(这是筛选每周第1个工作日),需要移除才能正确统计每月的工作日序号。

内容的提问来源于stack exchange,提问作者ziggy2561

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 03:15:56