OVERLAPS 述部
OVERLAPS 述語は、日時順の 2 つの期間が重なり合っているかどうかを判別します。 日時順の期間は、日時式のペアによって指定されます (最初の式は期間の開始を指定し、2 番目はその終了を指定します)。
それぞれの日時式 (start1、end1、start2、および end2) は、DATE、TIME、または TIMESTAMP の値を返す必要があります。
- start1 が DATE または TIMESTAMP 値を返す場合、他の式はすべて DATE または TIMESTAMP のいずれかの値を返す必要があります。そうならない場合、エラー SQL0401N が返されます。 返される DATE 値と関連付けられているデフォルトの時刻は 00:00 です。
- start1 が TIME 値を返す場合、他の式はすべて TIME 値を返す必要があります。そうならない場合、エラー SQL0401N が返されます。
開始値と終了値は、期間に含まれません。 例えば、期間 2016-10-19 から 2016-10-20 と 2016-10-20 から 2016-10-21 は重なり合いません。
どの式も NULL 値を返さない場合、OVERLAPS 述語は、期間が重なり合えば true を、重なり合わなければ false を返します。 1 つ以上の日時式が NULL 値を返す場合、次のように結果に影響します。
- 式の 1 つが NULL 値を返す場合、その期間の他の値が他の期間内に収まれば、結果は true になり、収まらなければ、結果は NULL になります。
- 式の 2 つ以上が NULL 値を返す場合、結果は NULL になります。
例
以下のステートメントは、行を返します。OVERLAPS 述部が true だからです (期間 2016 年 3 月 17 から 21 日が期間 2016 年 3 月 20 から 22 日と重なり合います)。
SELECT * from T1 where (cast('2016-03-17' as DATE),
cast('2016-03-21' as DATE)) OVERLAPS
(cast('2016-03-20' as DATE), cast('2016-03-22' as DATE));以下のステートメントは、行を返しません。OVERLAPS 述部が false だからです (開始値と終了値は期間に含まれないので、期間 2016 年 10 月 19 から 20 日は期間 2016 年 10 月 20 から 21 日と重なり合いません)。
SELECT * from T1 where (cast('2016-10-19' as DATE),
cast('2016-10-20' as DATE)) OVERLAPS
(cast('2016-10-20' as DATE), cast('2016-10-21' as DATE));
以下のステートメントは、行を返します。OVERLAPS 述部が true だからです (日付 2016 年 3 月 22 日が期間 2016 年 3 月 20 から 23 日の範囲内に収まります)。
SELECT * from T1 where (cast('2016-10-22' as DATE),NULL) OVERLAPS
(cast('2016-10-20' as DATE), cast('2016-10-23' as DATE));
