2

SQLにいくつかの間隔を保存しています。例:

id INT
from DATE
to DATE

NEW間隔が既存の間隔と競合するかどうかを(可能な場合は)1つの条件のみを使用して確認するにはどうすればよいですか?

例:

|-----------| (from 1 to 5)
    |-----------| (from 2 to 6)
       |--| (from 3 to 4)
                   |--| (from 7 to 8)

すべての間隔(最初の3つ)には、他の2つの間隔との競合があります...最後の間隔だけを除きます。

-

このチェックは、次のような条件を使用して実行できます。

WHERE (`from` <= $FROM and `to` >= $TO)

ただし、これは新しい間隔を含む間隔のみをチェックします...いくつかの交差点がある他の間隔、または新しい間隔の内側にある間隔はチェックしません。

多分このようなもの?

WHERE NOT (`from` < $FROM and `to` < $TO) AND NOT (`from` > $FROM and `to` > $TO)

Obs .:この新しい期間がすでに存在すること、または既存の期間と競合することをユーザーに警告するために、衝突を見つける必要があります。

4

2 に答える 2

3

私はこの質問に出くわし、真理値表がPaulがすでに投稿した縮小された論理をどのように識別できるかを示したいと思いました。

from [ to ]に対してチェックしたい間隔があると仮定しますfrom { to }

これは、次の真理値表に変換されます。

 #   [ < {   [ < }   ] < {   ] < }    Collision?  Example
 1     T       T       T       T          F       [ ] { }
 2     T       T       T       F          T       [ } { ] *
 3     T       T       F       T          T       [ { ] }
 4     T       T       F       F          T       [ { } ]
 5     T       F       T       T          T       ] } [ { *
 6     T       F       T       F          T       } [ ] { *
 7     T       F       F       T          Contradiction
 8     T       F       F       F          T       } [ { ] *
 9     F       T       T       T          T       ] { [ } *
10     F       T       T       F          Contradiction
11     F       T       F       T          T       { [ ] }
12     F       T       F       F          T       { [ } ]
13     F       F       T       T          T       ] { } [ *
14     F       F       T       F          T       } ] { [ *
15     F       F       F       T          T       { ] } [ *
16     F       F       F       F          F       { } [ ]

この真理値表を見ると、衝突を識別する最も簡単な式は次のとおりです。

NOT ( [ < { AND [ < } AND ] < { AND ] < } ) AND NOT ( [ >= { AND [ >= } AND ] >= { AND ] >= } )

ただし、と、から{ < }[ < ]これは次のようになります。

NOT ( [ < { AND ] < { ) AND NOT ( [ >= } AND ] >= } )

これはSQLに対応します:

WHERE NOT ('from' < $FROM and 'to' < $FROM ) AND NOT ('from' > $TO and 'to' > $TO)(@TiuTalkが提案したものと同様)。

ただし、すでにそれ{ < }とを想定してい[ < ]ます。これは重要です。*真理値表でマークされた行を見てください。それらの行で、} < {または] < [。私たちはそれらが起こらないことを知っています。} < { AND { < }さらに、一部の行は、不可能であることがわかっているような完全に矛盾することを意味します。これらの行をすべて削除すると、6行だけになります。

 #   [ < {   [ < }   ] < {   ] < }    Collision?  Example
 1     T       T       T       T          F       [ ] { }
 3     T       T       F       T          T       [ { ] }
 4     T       T       F       F          T       [ { } ]
11     F       T       F       T          T       { [ ] }
12     F       T       F       F          T       { [ } ]
16     F       F       F       F          F       { } [ ]

ここでは、真ん中の2つの句だけが衝突があるかどうかを判断していることがわかります。つまり、( [ < } ) AND NOT ( ] < { )。これは( [ < } ) AND ( ] >= { )、SQLと同等の(2番目のコンパレータを否定する)と同等WHERE ('from' < $TO AND 'to' >= $FROM)です。これは意味的にはPaulの節と同等です(<=最後まで作業することを除いて)。

于 2010-07-06T19:56:30.867 に答える
2
WHERE ($TO >= `from` AND $FROM <= `to`)

これは、新しい範囲が範囲全体と重なる場合、部分的にのみ重なる場合、およびそれを含む場合に機能することに注意してください。

于 2010-07-06T18:14:35.547 に答える