2

クエリで問題が発生しています。

select week_number
    ,year
from accounting_calender
where week_number<=3
and week_number>3-6
and year=2013

このクエリでは、レポートツールを介してweek_number3とyearを渡します。2013

次の出力が表示されます。

| Week_number | year |
----------------------
|    3        | 2013 |
|    2        | 2013 |
|    1        | 2013 |

しかし、ここで私の会計カレンダーテーブルに、2012年のエントリも返しました。

だからここで私は減算-6しているので、それは前年の週にも行かなければなりません。

私は以下の出力のようなものを探しています:

| Week_number | year |
----------------------
|   51        | 2012 |
|   52        | 2012 |
|   53        | 2012 |
|    3        | 2013 |
|    2        | 2013 | 
|    1        | 2013 |

読み取り専用アクセス権があります。

4

2 に答える 2

1

週と年を日付に変換すると、日付範囲への追加をはるかに簡単に実行できるようになります。

DECLARE @Week_Number INT
DECLARE @Year INT
DECLARE @WeeksToGet INT

SET @Week_Number = 3
SET @Year = 2013
SET @WeeksToGet = 6

DECLARE @StartDate DATETIME
DECLARE @EndDate DATETIME

SET @EndDate = DATEADD(WEEK, @Week_Number, DATEADD(YEAR, @Year - 1900, 0))
SET @StartDate= DATEADD(WEEK, -6, @EndDate)

select
    week_number,
    year
from accounting_calender
where 
    DATEADD(WEEK, week_number, DATEADD(YEAR, year - 1900, 0)) between
    @StartDate AND @EndDate

week_numberただし、これにより、およびにあるすべてのインデックスがわかりにくくなることに注意してくださいyear。これが懸念される場合はDATE、2つの列を1つの日付に変換する必要がないように、これらの列をタイプに変更することを検討してください。

SQLフィドル

于 2013-03-01T20:04:41.177 に答える
1

過去6週間が1年の境界を超える特別なケースを追加する必要があります。

select
  week_number,
  year
from
  accounting_calender
where
  (week_number > @week-6 and week_number <= @week and year=@year)
or
  (week_number > @week-6+53 and year=@year-1)

の場合@week >= 6、2番目の条件は常にである> 53ため、効果はありません。ただし、の場合@week < 6、2番目の条件は前年の、などになります5251

于 2013-03-01T20:05:27.923 に答える