0

いくつかの期間の比較のロジックに問題があります。データベースに次のようなテーブルがあります。

Id | startDate  | amount of weeks |
-----------------------------------
A1 | 2010-01-04 | 3
B3 | 2010-01-11 | 2

すべてのstartDateは、同じ曜日(月曜日)に開始します。

次に、2つのパラメーター(開始日と新しい「期間」の週数)を持つSQLクエリを作成する必要があり、startDateが同じであるすべての行をチェックして返す必要があります。ただし、実際には新しい「ピリオド」の範囲内にあるすべての行も返される必要があります。

これを明確にするためのいくつかの例:

- When I give the following parameters (2010-01-04, 1) I would need to have row 1 with id A1 returned
- (2010-01-11, 1) ---> return A1,B3
- (2009-12-28, 1) ---> return nothing
- (2009-12-28, 2) ---> return A1
- (2010-01-18, 1) ---> return A1,B3

これで、パラメータなどの操作方法がわかりました。したがって、基本的に、SQLクエリを構築するためのロジックについて少し助けが必要になります。

SELECT Id FROM table WHERE startDate={0}またはstartDate={1}....。

私はSQLServerを使用しています(ただし、非標準のSQLでもうまくいくと思います)。

4

3 に答える 3

1

これは機能します:

SELECT
    ID
FROM table
WHERE startDate = @startParam
AND DATEADD(WEEK, [amount of weeks], startDate) < DATEADD(WEEK, @numWeeksParam, @startParam)

編集:私はあなたの質問を誤解しました。これは実用的な解決策になるはずです:

SELECT
    ID
FROM TABLE
WHERE startDate BETWEEN @startParam AND DATEADD(WEEK, @numWeeksParam, @startParam)
OR DATEADD(WEEK, [amount of weeks], startDate) BETWEEN @startParam AND DATEADD(WEEK, @numWeeksParam, @startParam)
OR @startParam BETWEEN startDate AND DATEADD(WEEK, [amount of weeks], startDate)
OR DATEADD(WEEK, @numWeeksParam, @startParam) BETWEEN startDate AND DATEADD(WEEK, [amount of weeks], startDate)
于 2009-12-29T21:50:12.053 に答える
1

これを試して

 Select t.*
 From Table T
 Where @StartDate 
         Between t.StartDate And DateAdd(week, t.AmtWeeks, T.StartDate)
    or DateAdd(week, @AmtWeeks, StartDate) 
         Between t.StartDate And DateAdd(week, t.AmtWeeks, T.StartDate)
于 2009-12-29T21:54:09.033 に答える
0

あなたの質問は一般的であり、他の人はここでわずかに異なる要件で終わる可能性があるため:

確かにSQLServerにはintervalタイプがありますか?これにより、提供されるクエリが簡単になり、数週間だけでなく、任意の間隔を処理できるようになります。私はSQLServerの経験がありません---それらのint-to-interval-castswrtでどのようにうまくいくでしょうか。インデックスに?機能インデックスが必要な場合は、3つの日付を保存することもできます。これにより、間隔の前後で異なる可能性のある将来の要件を処理することもできます。

于 2009-12-29T22:30:34.777 に答える