2017-06-12 13 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が何を意味するのかをユーザーが理解するのは難しいので、週番号ではなく週開始を表示するように出力を変更したいが、バックエンドではまだ週番号を使用するように出力を変更したい。私はまた、ユーザーが一週間のデータなしで複数の週にまたがる日付を必ず選ぶため、ユーザーが任意の日付を選択できるようにしたくありません。

私は同様の質問を見て、フォーマット

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

のここ1つの SO question 推奨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] 

は、私はちょうど一週間は、日付を開始するとともに、グループ化するすべてのそれらの週の15秒を探していた、この出力

enter image description here

を得ました。

+0

代表的なテストデータとそのテストデータからの出力を追加してください。私たちにあなたの質問を提示し、それがもたらす不正確な結果が私たちにとって有益なものではありません。 – iamdave

答えて

0

おかげで同じ結果を得ることができます。私がより有能であれば、彼らはおそらく働いていただろうと確信しています。最後に、年、週番号、列見出しとして開始し、手動でそれらをExcelで作成したサーバー上に簡単なテーブルを作成しました。それから、私の結果をcteとして、その年の2017年とcte.weeknumber = commencedate.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

を排除する日付を取得します私はあなたの問題は、あなたが私のように、あなたが例自分自身と他の場所ではなく見てきた例を使用している方法であると思い試してみてくださいロジックをテストしたばかりで、問題なしで私のために働いているようです。下のスクリプトで見ることができます。

あなたの主な問題は、同じ日に発生するすべての値をgroupにする場合は、StartTime値のtime部分を削除しないことです。これを行う最も簡単な方法はdateデータ型に値を単にcastconvertです:

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)