我有一份报告,其中我根据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月)的非周末日历日期的想法?
答案 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);