2

このような期間というテーブルがあります

ピリオド ID | 期間年| 期間四半期

7 | 2009年 | 1

8 | 2009年 | 2

9 | 2009年 | 3

10 | 2009年 | 4

11 | 2010年 | 1

12 | 2010年 | 2

表の各行は、1 年の 4 つの四半期のうちの 1 つを表します (3 か月の学期など)。たとえば、最初の行は 2009 年の期間 1 (つまり、2009 年 1 月 1 日から 2009 年 3 月 31 日までの日付範囲) を表します。

次の疑似コードのように、上の表から行/期間を選択するクエリを作成する必要があります。ここで、期間は 2 つの日付範囲の間に発生します。

select *
from Periods
where Period is between @startDate and @endDate

クエリは dbo.GetPeriodsFromDateRange というテーブル値関数内で使用され、@startDate と @endDate は関数のパラメーターです。

私は立ち往生していて、それを行う方法がわかりません。助けてください。これは T-SQL (MS SQL Server 2000/2005) に適用されます。

4

3 に答える 3

6

試す

select *
from Periods
where  dateadd(qq,PeriodQuarter-1,dateadd(yy,PeriodYear -1900,0)) 
between @startDate and @endDate
于 2010-07-07T10:37:35.477 に答える
2

スキャンの代わりにシークが可能です:

SELECT *
FROM Periods
WHERE
   PeriodYear BETWEEN Year(@startdate) AND Year(@enddate)
   AND PeriodYear * 4 + PeriodQuarter
      BETWEEN Year(@startdate) * 4 + DATEPART(Quarter, @startdate)
      AND Year(@startdate) * 4 + DATEPART(Quarter, @enddate)

説明:

年と四半期の 2 つの構成要素から新しいスケーリングされた整数を作成し、年と四半期の各組み合わせを 1 つの数値として扱います。

代わりに、次のようにしたと想像してください。

AND PeriodYear + (PeriodQuarter - 1) / 4.0
   BETWEEN Year(@startdate) + (DATEPART(Quarter, @startdate) - 1) / 4.0
   AND Year(@startdate) + (DATEPART(Quarter, @enddate) - 1) / 4.0

元の表現を「Mult」と呼び、この新しい表現を「Div」と呼んでいます。年と四半期、およびこれらの表現が評価されるものを次に示します。

年 四半期 Div Mult
2009 1 2009.00 8037
2009 2 2009.25 8038
2009 3 2009.50 8039
2009 4 2009.75 8040
2010 1 2010.00 8041
2010 2 2010.25 8042
2010 3 2010.50 8043

したがって、これらの行に対して WHERE 句を実行すると、次のようになります。

WHERE Div BETWEEN 2009.25 AND 2010.00

正しい行がどのように返されるかがわかります。Mult バージョンは実際にはまったく同じことを行い、四半期を縮小する代わりに年を拡大するだけです。私がそれを使用した理由は、整数の計算と乗算が分数の計算と除算よりも高速だからです。

年だけで始まる 2 つの条件を使用する理由は、クエリを検索可能にするためです。年だけに基づいてシークを実行したいのですが、これは、年に 4 を掛けたり、他の計算を行ったりする場合には不可能です。そのため、最初に適切な年だけをスキャンしてから、微調整して、結果に含まれない四半期を除外します。

もう 1 つのオプションは、計算列を追加してインデックスを配置することです。これにより、コードの挿入または更新を変更する必要はありませんが (列リストを適切に使用している限り)、必要に応じて通常の範囲計算を行うことができます。

于 2010-07-16T18:55:34.400 に答える
0

テーブルにさらに2つの列を追加したくなるでしょう...

StartDateEndDate - これらは、各期間の開始日と終了日を格納します (例では、StartDate=2009 年 1 月 1 日、EndDate=2009 年 3 月 31 日)。

これにより、四半期が提案したものとは異なるように定義されている場合に、より柔軟に対応できます。

これを行うと、クエリはかなり単純になります...

select *
from Periods
where @startDate<Periods.StartDate and @endDate>Periods.EndDate

これは、@StartDate と @EndDate の間に完全にカプセル化された期間のみを含めることを前提としています。重複する期間が必要な場合は、次のようなものを試してください...

select *
from Periods
where @EndDate>Periods.StartDate and @StartDate<Periods.EndDate
于 2010-07-07T10:33:54.877 に答える