如何更好地识别SQL中指定的起点和终点内的表冲突?

如何更好地识别SQL中指定的起点和终点内的表冲突?,sql,sql-server,datetime,between,timetable,Sql,Sql Server,Datetime,Between,Timetable,我使用以下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]) A

我使用以下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])
但问题是,当我有一行的起始值是另一行的等效结束值时。我已经在下面显示了2016年2月30日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语句以消除返回这些端点的行?

请查看。介于之间包含范围内的值


改为使用“”,这将解决您的问题

我相信这对我现在很有效:

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])
其中(e1.[module]=@module)
和(e2。[模块]=@模块)
和(e1.[end]>e2.[start])
和(e1.[end]=e2.[start])
和(e1.[start]
如果我理解,您希望获得两个模块同时存在的所有行

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.[module] = e2.[module] AND e1.[id] < e2.[id]
WHERE e1.[module] = @module AND ((e1.[start] BETWEEN e2.[start] AND e2.[end])
    OR  (e1.[end] BETWEEN e2.[start] AND e2.[end]))
选择e1.[id]、e1.[start]、e1.[end]、e2.[id]作为Expr1,e2.[start]作为Expr2,e2.[end]作为Expr3
从课时起为e1
内部联接类时间为e1上的e2。[module]=e2。[module]和e1。[id]
连接条件似乎非常奇怪。正如jarlh所说,在你的情况下,手术室存在支架问题。我一直在使用这里提供的解决方案:
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.[module] = e2.[module] AND e1.[id] < e2.[id]
WHERE e1.[module] = @module AND ((e1.[start] BETWEEN e2.[start] AND e2.[end])
    OR  (e1.[end] BETWEEN e2.[start] AND e2.[end]))