0

テーブルのdatecolumnが他のテーブルからの別の2セットの日付の範囲内にあるかどうか、日付の条件を確認する必要があります..

最初のテーブル:

1. id
2. name
3. date

2 番目のテーブル。

1. id
.
.
.
.
17 : Start Date
18 : End Date

date最初のテーブルのフィールドが 2 番目のテーブルの範囲内にあるStart Dateかどうかを確認する必要がありEnd Dateます。

例えば

t1.date>= t2.Start Date and t1.date <= t2.End Date

問題は、null である行がいくつかあるt2ことです。そうであればnull、2 番目の条件は を返しtrueます。

最初のケース

 t1.date = 26-Nov-2011
 t2.Start Date = 25-Nov-2011
 t2.End Date  = 27-Nov-2012
 *Passed*

2番目のケース

 t1.date = 26-Nov-2011
 t2.Start Date = 25-Nov-2011
 t2.End Date  = 25-Nov-2011

  *FAILED*

3番目のケース

 t1.date = 26-Nov-2011
 t2.Start Date = 27-Nov-2011
 t2.End Date  = 27-Nov-2011

  *FAILED*

4番目のケース

 t1.date = 26-Nov-2011
 t2.Start Date = 25-Nov-2011
 t2.End Date  = null

  *Passed*

助けてください。

4

2 に答える 2

4

つまり、基本的には、終了日がない場合は「進行中」のケースとして扱いたいので、最初の条件が true の場合は true にする必要があります。基本的に、次の場合に条件が満たされます。

  1. 日付が開始日以降であり、かつ
  2. a. 日付が終了日より前または終了日である、または
    b. 終了日はありません

これで、SQL を実行するのは簡単になりました。

(t1.date>= t2.StartDate) and ((t1.date <= t2.EndDate) or (t2.EndDate is null))

betweenandを使用して同様の結果を得ることができますがisnull、私に関する限り、条件が自明である場合ははるかに明確であり、それらを平文として読み取ることができます。


t2(左結合のように、行全体がnullであるという仮定の下での古い答え)

2 番目の行が null でない、つまり、フィールドt2.StartDateとフィールドt2.EndDateがnull でないという条件を追加するだけです。

(t1.date>= t2.Start Date and t1.date <= t2.End Date and t2.End Date is not null)
于 2013-09-30T06:28:04.683 に答える
0

IS NOT NULLを使用することが可能です

次に、次のようになります

(t1.date BETWEEN t2.Start Date and t2.End Date AND t2.End Date IS NOT NULL)

ところで、列名にスペースを使用しないでください。代わりにendDateまたはend_dateを使用してください(私はendDateを好みます)

于 2013-09-30T06:29:24.523 に答える