2011-04-06 108 views
0

可能重复:
How can I determine in SQL Server if a dateTime range overlaps anotherSQL Server和BETWEEN

嗨, 我想,以确定是否给定的开始时间,并与另一条记录的结束时间冲突。我目前使用下面的查询,如果我得到的1个或多个结果,我知道它已经发生冲突:

SELECT 
    Sheet.SheetID, 
    Sheet.StartTime, 
    Sheet.EndTime, 
FROM 
    Sheet 
WHERE 
    AND @StartTime BETWEEN Sheet.StartTime AND Sheet.EndTime 
    OR @EndTime BETWEEN Sheet.StartTime AND Sheet.EndTime 

这种运作良好,但一个真正的用户应该能够进入相同的开始时间之前的结束时间,即。上班时间是早上6点,新工作开始时间是早上6点。上述查询不允许出现这种情况。

我有一种感觉,我可能需要使用大于和小于,而不是之间,但很想听到任何建议。

在此先感谢

回答

0

使用“大于(小于)”是表现更好,所以微软建议这一条款。你应该使用它。

0

正如你已经想通了,该BETWEEN运算符是包容性(见文档here)。

我认为你需要做到以下几点:

SELECT 
    Sheet.SheetID, 
    Sheet.StartTime, 
    Sheet.EndTime, 
FROM 
    Sheet 
WHERE 
    (@StartTime > Sheet.StartTime AND @StartTime < Sheet.EndTime) 
    OR (@EndTime > Sheet.StartTime AND @EndTime < Sheet.EndTime) 

请注意,我并没有把在> =或< =运营商,因为这会阻止你想允许早上6点结束/早上6点开始的情况。

编辑刚刚有一个想法 - 如果新工作表没有在现有工作表的范围内开始或结束,但其中包含整个其他工作表?会发生吗?例如,你有开始在凌晨2点和凌晨4点结束一个现有表记录。您尝试插入一个新的开始于凌晨1点和早上5点结束。你的查询(和我原来的)会允许这个!

你必须修改它,如下所示:

SELECT 
    Sheet.SheetID, 
    Sheet.StartTime, 
    Sheet.EndTime, 
FROM 
    Sheet 
WHERE 
    (@StartTime > Sheet.StartTime AND @StartTime < Sheet.EndTime) 
    OR (@EndTime > Sheet.StartTime AND @EndTime < Sheet.EndTime) 
    OR (@StartTime < Sheet.StartTime AND @EndTime > Sheet.EndTime) 
0

定义“与冲突” ......但如果你的意思是“重叠”,则条件应该是:

WHERE @StartTime < Sheet.EndTime AND @EndTime > Sheet.StartTime 

您可以选择“<=”或“>=”而不是“<”或“>”如果你想要完全一样的瞬间计数。

该条件检查@StartTime中的值出现在工作表结束之前,并且@EndTime中的值发生在工作表开始之后。如果这两个条件都满足,在工作表的条目以@[email protected]重叠。