我有一个SSRS报告,该报告将按周细分的VDI池返回唯一的登录计数。例如,对于一月份,它将显示为:
Week # of Logins
2015_JANUARY_WEEK_NO_1 3
2015_JANUARY_WEEK_NO_2 49
我使用“星期”列链接到另一个报告,该报告将显示所选星期的登录信息,因此我必须获取所选星期的第一天和所选星期的最后一天,并将它们作为参数传递给其他报告。
我知道如何从“周”列中获取年份和周号。
=Mid(Fields!Week.Value,1,4)
给我一年 =Trim(Mid(Fields!Week.Value,Len(Fields!Week.Value),Len(Fields!Week.Value)))
给我一周。
我发现此T-SQL有效:
DECLARE @WeekNum INT
, @YearNum char(4);
SELECT @WeekNum = 2
, @YearNum = 2015
-- once you have the @WeekNum and @YearNum set, the following calculates the date range.
SELECT DATEADD(wk, DATEDIFF(wk, 6, '1/1/' + @YearNum) + (@WeekNum-1), 6) AS StartOfWeek;
SELECT DATEADD(wk, DATEDIFF(wk, 5, '1/1/' + @YearNum) + (@WeekNum-1), 5) AS EndOfWeek;
但我不知道如何将其转换为不会引发错误的表达式。
到目前为止,这是我得到的:
=DateAdd("w", DateDiff("w", 6, '1/1/' + (Mid(Fields!Week.Value,1,4))) + (Trim(Mid(Fields!Week.Value,Len(Fields!Week.Value),Len(Fields!Week.Value)))
- 1), 6)
当我尝试在设计视图中运行报表时,它返回一个表达式预期错误。
编辑对不起,我想我应该发布填入报告的原始查询。在下面:
SELECT Convert(varchar(20),UPPER(DATENAME(YEAR, Time)))
+'_'+CONVERT(varchar(20),UPPER(DATENAME(MONTH, Time)))
+'_WEEK_NO_'+CONVERT(varchar(10),(DAY(Time)
+ (DATEPART(DW, DATEADD (MONTH, DATEDIFF (MONTH, 0, Time), 0))-1) -1)/7 + 1) as 'Week'
, Count(DISTINCT SUBSTRING(ModuleAndEventText,LEN('User ') + 2
, CHARINDEX(' requested', ModuleAndEventText) - LEN('User ') - 2)) as WeekCount
FROM VE1_UserLogins
WHERE DesktopId = @Pool
AND ([Time] BETWEEN (@StartDate) and (DATEADD(ms, -1, @EndDate +1)))
GROUP BY Convert(varchar(20),UPPER(DATENAME(YEAR, Time)))
+'_'+CONVERT(varchar(20),UPPER(DATENAME(MONTH, Time)))
+'_WEEK_NO_'+CONVERT(varchar(10),(DAY(Time)
+ (DATEPART(DW, DATEADD (MONTH, DATEDIFF (MONTH, 0, Time), 0))-1) -1)/7 + 1),YEAR(Time),MONTH(Time)
ORDER BY YEAR(Time), MONTH(Time), Week
我假设您Fields!Week.Value
采用string
的date
格式类似MM/dd/yyyy
或类似的格式,因此,如果您想将该周的开始Sunday
作为第一天和Saturday
最后一天,并且想要到达该日期,则应该使用以下表达式,
在一周的开始,
=DateAdd("d",1- DatePart("w", CDate(Fields!WeekDate.Value)), CDate(Fields!WeekDate.Value))
在本周末,
=DateAdd("d", 7 - DatePart("w", CDate(Fields!WeekDate.Value)), CDate(Fields!WeekDate.Value))
更新现在有两种方法可以实现您想要的
1)在sql中计算星期的开始和星期的结束,并将结果直接显示在repott上
2)time
从sql获取字段并在SSRS中设置表达式
对于第一种实现方法,需要在选择sql语句中添加这两行
DATEADD(dd, -(DATEPART(dw, MIN(Time))-1),MIN(Time)) AS 'StartOfWeek'
,DATEADD(dd, 7-(DATEPART(dw, MIN(Time))), MIN(Time)) AS 'EndOfWeek'
第二种实现方法是更新Sql
语句以获取日期部分,然后将该日期包括在上面的给定表达式中。因此,对于您的查询,您需要添加,
,MIN(Time) AS WeekDate
然后,您可以将传入字段WeekDate
用作输入来使用以上表达式(我已经更新了表达式)。
但是,如果date
除了计算一周的开始和结束之外没有其他实际需要,则可以使用第一种方法从格式化后的sql服务器获取数据。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句