SSRS 表达式 - 从周值中查找一周的第一天
SSRS Expression - Find First Day of Week From Week value
我收到一份 SSRS 报告,其中 returns 我们的 VDI 池的唯一登录计数按周细分。
例如,对于一月份,它将显示为:
Week # of Logins
2015_JANUARY_WEEK_NO_1 3
2015_JANUARY_WEEK_NO_2 49
我正在使用“周”列 link 到另一个显示 selected 周登录的报告,因此我必须获得 selected 的第一天周和 select 周的最后一天,并将它们作为参数传递给其他报告。
我知道如何从“周”列中提取年和周#。
=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)
当我尝试 运行 设计视图中的报告时,它 returns 表达式预期错误。
编辑
抱歉,我想我应该发布填充报告的原始查询。下面是:
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) 从 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 服务器获取格式化后的数据。
我收到一份 SSRS 报告,其中 returns 我们的 VDI 池的唯一登录计数按周细分。 例如,对于一月份,它将显示为:
Week # of Logins
2015_JANUARY_WEEK_NO_1 3
2015_JANUARY_WEEK_NO_2 49
我正在使用“周”列 link 到另一个显示 selected 周登录的报告,因此我必须获得 selected 的第一天周和 select 周的最后一天,并将它们作为参数传递给其他报告。
我知道如何从“周”列中提取年和周#。
=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)
当我尝试 运行 设计视图中的报告时,它 returns 表达式预期错误。
编辑 抱歉,我想我应该发布填充报告的原始查询。下面是:
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) 从 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 服务器获取格式化后的数据。