尝试在我的SSRS报告中显示工作日的工作日日期

时间:2014-03-10 14:54:32

标签: reporting-services

我有一份报告,其中我根据SQL查询中发生事件的日历日期计算了工作日(因此没有周末)。 IE,

Date_Completed:2014年1月22日(< ---来自系统表)
Day_completed = 16< ----我在查询中计算的内容。

现在,我正在尝试在SSRS中创建类似日历的报告,以便跟踪事件日期。我想将工作日和相应的日历日期作为我的列标题,即

1
2014年1月1日

2
2014年1月2日

所以我的问题是事件不会在每个工作日发生,所以我在我的查询中创建了一堆虚拟值(基本上是1-40个工作日的联合...我将努力使这个动态化未来)。

所以现在我有1-40个工作日列,我的值正确地与它们对齐...但是,日历日期不匹配,因为我不知道如何在我的列标题中使SSRS跳过周末日期...

我尝试过类似的事情:

= IIF((平日(DATEADD( “d”,字段period_complete.Value,字段period_dt.Value))≤;!→1 或工作日(dateadd(“d”,Fields!period_complete.Value,Fields!period_dt.Value))<> 7), DATEADD( “d”,字段!period_complete.Value,字段!period_dt.Value), “”)

但这没有做任何事。任何人都有任何关于如何让SSRS吐出一个季度(1月至3月)的非周末日历日期的想法?

1 个答案:

答案 0 :(得分:0)

我从您的问题中看到您正在尝试使用SSRS表达式来实现您想要的结果。但是,当谈到动态过滤时,我发现自己转向使用SQL来完成大部分工作。考虑到这一点,我认为这将实现您期望的目标。

下面的查询将创建一年中所有日期的列表(等于基于系统时间的当前年份)。然后,它会以星期和一年中的某一天为您提供星期几。此外,它将过滤掉所有星期六和星期日,让您只有工作日。最后,它计算我们现在所处的季度(我按季度使用季度,但您可以轻松地将其调整为滚动季度或财政年度季度),作为过滤当前季度的天数列表的方法。如果您有任何疑问,请与我们联系。

Declare @Start date = Case
                            When Month(getdate()) <= 3
                            Then '01/01/' + CAST(YEAR(getdate()) as varchar(4))
                                When Month(getdate()) <= 6
                                Then '04/01/' + CAST(YEAR(getdate()) as varchar(4))
                                    When Month(getdate()) <= 9
                                    Then '07/01/' + CAST(YEAR(getdate()) as varchar(4))
                            Else '10/01/' + CAST(YEAR(getdate()) as varchar(4))
                            End;
Declare @End date = Case
                            When Month(getdate()) <= 3
                            Then '03/31/' + CAST(YEAR(getdate()) as varchar(4))
                                When Month(getdate()) <= 6
                                Then '6/30/' + CAST(YEAR(getdate()) as varchar(4))
                                    When Month(getdate()) <= 9
                                    Then '09/30/' + CAST(YEAR(getdate()) as varchar(4))
                            Else '12/31/' + CAST(YEAR(getdate()) as varchar(4))
                            End;
Set NoCount on;

With All_Dates as (
Select CAST('01/01/' + CAST(YEAR(getdate()) as varchar(4)) as Date) as Dates

Union All

Select DATEADD(day,1,Dates) as Dates

From All_Dates

Where Dates < '12/31/' + CAST(YEAR(getdate()) as varchar(4))
)

Select DATEPART(DAYOFYEAR,Dates) as Day_of_Year
    , DATEPART(WEEKDAY,Dates) as Day_of_Week
    , Dates

From All_Dates

Where DATEPART(WEEKDAY,Dates) between 2 and 6
    and Dates >= @Start
    and Dates <= @End

Option (MaxRecursion 400);