2017-06-12 57 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) 
相關問題