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

时间:2015-01-23 00:13:21

标签: reporting-services

我有一份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

1 个答案:

答案 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获取数据。