SSRS表达 - 从周值查找周的第一天

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)

Mah*_*esh 7

我假设你Fields!Week.Valuestringdate像格式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获取数据.