2017-06-12 56 views
0

我有一个按星期编号分组的报表,但由于演示的原因,希望它在星期开始。将星期数转换为从SSRS/SQL Server开始的星期

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周在上下文中的含义,所以我想改变我的输出以显示Week Commencing而不是Week number,但是后端仍然使用Weeknumber。我也不希望用户能够选择任何日期,因为他们总是选择跨越多周的日期而没有完整的星期数据。

我看类似的问题和一个在这里 SO question 格式

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

但堵我的专栏成格式的推荐SQL给了我一个有点乱。它没有把我的期望分成几组。

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

,我一直在寻找那些一周15S将只有一个星期开始日期组合在一起。

+0

请在测试数据中添加一些有代表性的测试数据和您想要的输出。向我们显示您的查询和它产生的不正确结果并不是对我们有帮助。 – iamdave

回答

0

感谢您的答案。我相信如果我更有能力,他们可能会工作。最后,我在服务器上创建了一个简单的表格,其中包括年份,星期编号,开始列标题,并在Excel中手动创建它们。然后,我将结果作为cte链接到年份= 2017和cte.weeknumber = begindate.weeknumber的表格中。这似乎奏效了。

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

0

试试这将work.This检索日期消除它的一部分时间

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] 
+0

这个答案似乎遭受同样的问题。 Dateadd(...)列的每个[周数]有多行,而不是我要查找的行。 – tomdemaine

+0

您可以编辑您的问题并包含脚本来重现您的数据样本,然后我们可以使用它测试。 –

0

我觉得你的问题是你如何使用你在其他地方并没有看到与自己的例子的例子中,我刚刚测试了逻辑,它似乎正在为我工​​作,没有问题,你可以在下面的脚本中看到。

我认为你的主要问题是你并没有删除StartTime值的time部分,如果你想要在同一天发生的所有值,你将需要这样做。要做到这一点,最简单的方法就是castconvert值来date数据类型:

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  | 
+------------+------------+----------------+ 
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) 
相关问题