我有一份SSRS报告,它会按照按周细分的VDI池返回唯一的登录计数。 例如,对于1月,它将显示为:
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
答案 0 :(得分:7)
我假设您的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)从sql中获取time
字段并在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'
实现的第二种方式是
更新您的Sql
语句以获取日期部分,然后将该日期包含在上面给出的表达式中。
那么对于您的查询,您需要添加,
,MIN(Time) AS WeekDate
然后你可以使用上面的表达式来使用传入的字段WeekDate
作为输入(我已经更新了表达式)。
但是,如果除了计算一周的开始和结束之外你没有实际需要date
,那么使用第一种方法从格式化的sql server获取数据。