将周数转换为在SSRS / SQL Server中开始的周数

时间:2017-06-12 10:41:40

标签: sql sql-server reporting-services

我的报告按周编号分组,但出于演示原因,希望它是一周开始。

    Select
        datepart(wk,[rhStartTime]) as [week number]

        ...

  group by datepart(wk,[rhStartTime]),[rhOperatorName])
      where 
    [week number] >= @StartWeek 
  and [week number] <= @EndWeek

我的报告参数使用周数来过滤数据,其中@StartWeek和@EndWeek是插入SQL的整数。我的问题是介绍之一。用户很难理解第15周在上下文中的含义,所以我想改变输出以显示周开始而不是周数,但是后端仍然使用周数。我也不希望用户能够选择任何日期,因为他们总是会选择跨越多周的日期而没有完整的周数据。

我在这里看到类似的问题 SO question  推荐格式为

的SQL
DATEADD(dd, -(DATEPART(dw, WeddingDate)-1), WeddingDate) [WeekStart]

但是将我的专栏插入那种格式会给我带来一些麻烦。它没有把我的期望分组。

SELECT 

DATEADD(dd, -(datepart(wk,[rhStartTime]))-1), [rhStartTime])) as [week commencing]

      ,datepart(wk,[rhStartTime])) as [week number]

...

group by datepart(wk,[rhStartTime])),DATEADD(dd, -(datepart(wk,[rhStartTime]))-1), [rhStartTime])),[rhoperatorname]

我得到了这个输出

enter image description here

我正在寻找所有那些15周组合起来,只有一周的开始日期。

4 个答案:

答案 0 :(得分:0)

尝试这将有效。这将检索消除时间部分的日期

SELECT 

Dateadd(dd,-(datepart(wk,convert( varchar(10),[rhStart Time],120))-1), convert( varchar(10),[rhStart Time],120))
 ,datepart(wk,[rhStart Time])) as [week number]
...
from Table X
 group by Dateadd(dd,-(datepart(wk,convert( varchar(10),[rhStart Time],120))-1), convert( varchar(10),[rhStart Time],120))
          ,datepart(wk,[rhStart Time]))
          ,[Agent Name]

答案 1 :(得分:0)

我认为你的问题在于你如何使用你在别处看到的例子而不是示例本身,因为我刚刚测试了逻辑,它似乎对我有用而没有问题,你可以在下面的脚本。

我认为您的主要问题是,您没有删除time部分的StartTime部分,如果您希望group所有值发生在cast上,您需要执行此操作同一天。最简单的方法是简单地convertdate select cast(StartTime as date) as CastToDate ,convert(date, StartTime, 103) as ConvertToDate -- You may need to use 101 depending on your server setting for dd/mm/yyyy or mm/dd/yyyy 数据类型的值:

declare @StartDate date = '20170325'
        ,@EndDate date = '20170403';

-- Tally table to create dates to use in functions:
with n(n) as(select n from (values(1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n(n))
    ,d(d) as(select top(datediff(d,@StartDate,@EndDate)+1) dateadd(d,row_number() over (order by (select null))-1,@StartDate) from n n1,n n2,n n3,n n4,n n5,n n6)
select d
    ,datepart(week,d) as WeekNumber
    ,DATEADD(dd, -(DATEPART(dw, d)-1), d) as WeekCommencing
from d
order by d;

脚本:

+------------+------------+----------------+
|     d      | WeekNumber | WeekCommencing |
+------------+------------+----------------+
| 2017-03-25 |         12 | 2017-03-19     |
| 2017-03-26 |         13 | 2017-03-26     |
| 2017-03-27 |         13 | 2017-03-26     |
| 2017-03-28 |         13 | 2017-03-26     |
| 2017-03-29 |         13 | 2017-03-26     |
| 2017-03-30 |         13 | 2017-03-26     |
| 2017-03-31 |         13 | 2017-03-26     |
| 2017-04-01 |         13 | 2017-03-26     |
| 2017-04-02 |         14 | 2017-04-02     |
| 2017-04-03 |         14 | 2017-04-02     |
+------------+------------+----------------+

输出:

 private function playerIdValidation()
{
    if(!isset($this->betslip["player_id"]) || !is_int($this->betslip["player_id"]))
    {
        $this->success = false;
        array_push($this->betslip["errors"], 1);
        return 1;
    }
}

答案 2 :(得分:0)

使用下面的表达式替换SQL代码中的字段值以删除时间

DATEADD(dd, -(DATEPART(dw,[rhStartTime]) -1), DATEDIFF(dd, 0, [rhStartTime]) ) 

您也可以使用SSRS中的以下表达式来实现相同的结果(更改它以匹配您的日期字段)

= DATEADD("d", - DATEPART(DateInterval.Weekday,Fields!rhStartTime.Value) +1,Fields!rhStartTime.Value)

答案 3 :(得分:0)

感谢您的回答。如果我更有能力,我相信他们可能会工作。最后,我在服务器上创建了一个简单的表,其中包含year,weeknumber,begindate作为列标题,并在excel中手动创建它们。然后我把我的结果作为cte链接到那个表年份2017年和cte.weeknumber = beginningdate.weeknumber这个表似乎有效。

现在在我的SSRS报告参数中,我使用weeknumber作为值并开始日期作为标签。因此,我不必更改任何其他配置。