0

特定のモジュールの行に日付の競合がある行を返す次の SQL ステートメントがあります。

SELECT e1.[id], e1.[start], e1.[end], e2.[id] AS Expr1, e2.[start] AS Expr2, e2.[end] AS Expr3
FROM ClassTimes AS e1 
INNER JOIN ClassTimes AS e2 ON e1.[id] < e2.[id]
WHERE (e1.[start] BETWEEN e2.[start] AND e2.[end])
AND (e1.[module] = @module) 
AND (e2.[module] = @module) 
OR  (e1.[module] = @module) 
AND (e2.[module] = @module) 
AND (e1.[end] BETWEEN e2.[start] AND e2.[end])

一部の競合では、返されるデータベースの次の行など、これはうまく機能します。

id| start            | end              | module                 
----------------------------------------------------
1 | 30/02/2016 10:00 | 30/02/2016 11:00 | 1
2 | 30/02/2016 10:30 | 30/02/2016 11:30 | 1

しかし、私が抱えている問題は、別の行の同等の終了値である開始値を持つ行がある場合です。30/02/2016 13:00 という値について以下に示しました。

id| start            | end              | module                 
----------------------------------------------------
3 | 30/02/2016 12:00 | 30/02/2016 13:00 | 1
4 | 30/02/2016 13:00 | 30/02/2016 14:00 | 1

SQL ステートメントを修正して、これらのエンドポイントが返される行を削除するにはどうすればよいですか?

4

3 に答える 3

0

これを見てください。Between には、範囲内の値が含まれます。

代わりに「<」と「>」を使用すると、問題が解決します

于 2016-03-31T13:41:15.720 に答える
0

私はこれが今私のために働いていると信じています:

WHERE (e1.[module] = @module) 
AND (e2.[module] = @module) 
AND (e1.[end] > e2.[start]) 
AND (e1.[end] <= e2.[end]) 
OR  (e1.[module] = @module) 
AND (e2.[module] = @module) 
AND (e1.[start] >= e2.[start]) 
AND (e1.[start] < e2.[end])
于 2016-03-31T14:29:04.953 に答える