Mik*_*ton 1 reporting-services
我有一份SSRS报告,它会按照按周细分的VDI池返回唯一的登录计数.例如,对于1月,它将显示:
Week # of Logins
2015_JANUARY_WEEK_NO_1 3
2015_JANUARY_WEEK_NO_2 49
Run Code Online (Sandbox Code Playgroud)
我正在使用"周"列链接到另一个报告,该报告将显示所选周的登录信息,因此我必须获取所选周的第一天和选择周的最后一天,并将其作为参数传递给其他报告.
我知道如何从周专栏中获取年份和周数#.
=Mid(Fields!Week.Value,1,4)
Run Code Online (Sandbox Code Playgroud)
给了我一年和
=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;
Run Code Online (Sandbox Code Playgroud)
但我无法弄清楚如何把它变成一个不会抛出错误的表达式.
这是我到目前为止所得到的:
=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)
Run Code Online (Sandbox Code Playgroud)
当我尝试在设计视图中运行报表时,它返回一个表达式预期错误.
编辑 抱歉,我想我应该发布填写报告的原始查询.它在下面:
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
Run Code Online (Sandbox Code Playgroud)
我假设你Fields!Week.Value是string在date像格式MM/dd/yyyy或类似的东西,所以如果你想获得那一周开始Sunday的第一天,Saturday 作为最后一天,你要到那里约会,那么你应该使用下面的表达,
一周开始,
=DateAdd("d",1- DatePart("w", CDate(Fields!WeekDate.Value)), CDate(Fields!WeekDate.Value))
Run Code Online (Sandbox Code Playgroud)
在一周结束时,
=DateAdd("d", 7 - DatePart("w", CDate(Fields!WeekDate.Value)), CDate(Fields!WeekDate.Value))
Run Code Online (Sandbox Code Playgroud)
更新 现在有两种方法可以达到你想要的效果
1)计算sql的星期开始和星期结束,并将结果直接显示在repott上
2)time从sql中获取字段并在SSRS中设置表达式
对于第一种实现方法,您需要在select sql语句中添加这两行
DATEADD(dd, -(DATEPART(dw, MIN(Time))-1),MIN(Time)) AS 'StartOfWeek'
,DATEADD(dd, 7-(DATEPART(dw, MIN(Time))), MIN(Time)) AS 'EndOfWeek'
Run Code Online (Sandbox Code Playgroud)
第二种方法是更新您的Sql语句以获取日期部分,然后将该日期包含在上面给定的表达式中.那么对于你的查询,你需要添加,
,MIN(Time) AS WeekDate
Run Code Online (Sandbox Code Playgroud)
然后你可以使用上面的表达式使用传入的字段WeekDate作为输入(我已经更新了表达式).
但是,如果date除了计算一周的开始和结束之外没有其他实际需要,那么使用第一种方法从格式化的sql server获取数据.
| 归档时间: |
|
| 查看次数: |
11081 次 |
| 最近记录: |