0

我有一个表,其中包括两列StartTime和除其他列之外EndTime的类型Time。我想检索StartTimeEndTime某个输入时间范围冲突的行。

假设该表包含以下行:

ID Status StartTime EndTime
-- ------ --------- --------
0     0   08:00:00  08:50:00
1     1   08:50:00  09:40:00

而且我想与范围冲突08:00:00- 08:40:00。它应该返回第一行。

我正在尝试这样做:

SELECT *
FROM MyTable
WHERE
StartTime BETWEEN '08:00:00' AND '08:40:00'
OR
EndTime BETWEEN '08:40:00' AND '08:40:00'

如果有人解决我的这个问题,我将非常感激。

4

5 回答 5

4

同意@John Dewey,如果您想找到与特定范围冲突的范围,您的条件似乎不完整,因为正如约翰正确指出的那样,如果指定范围完全落在表中某个范围的边界之间,则相应的行将不符合您的条件。

但是,与其让你的情况变得更复杂,你实际上可以让它变得更简单,就像这样:

SELECT *
FROM MyTable
WHERE StartTime <= '08:40:00'
  AND EndTime   >= '08:00:00'
于 2012-05-27T09:11:46.927 回答
2

也许这实际上从未发生过,但为了彻底,我还将检查范围“08:00:00”和“08:40:00”完全介于 StartTime 和 EndTime 之间的冲突,例如 StartTime = 07:30: 00 和结束时间 = 09:00:00:

SELECT *
FROM MyTable
WHERE (
    StartTime BETWEEN '08:00:00' AND '08:40:00'
    OR
    EndTime BETWEEN '08:00:00' AND '08:40:00'
    OR
    '08:00:00' BETWEEN StartTime AND EndTime
    OR
    '08:40:00' BETWEEN StartTime AND EndTime
)
于 2012-05-27T05:10:50.290 回答
1
SELECT * 
FROM MyTable 
WHERE 
   StartTime BETWEEN '08:00:00' AND '08:40:00' 
OR EndTime BETWEEN '08:00:00' AND '08:40:00' 
于 2012-05-27T03:58:00.717 回答
1

你的第二个子句应该是EndTime BETWEEN '08:00:00' AND '08:40:00'. 否则,你所拥有的应该工作。

于 2012-05-27T03:58:31.433 回答
0

要仅返回第一条记录,请使用TOP确保ORDER BY在使用时包含TOP 来确定什么是“第一条”记录。这union是因为我假设“第一个”值可以由开始时间或结束时间确定。注意ORDER BY必须在子查询中使用,任何时候使用TOP,否则会得到意想不到的结果。

SELECT TOP(1)[Status],StartTime,EndTime 
FROM (
      SELECT TOP(1) [Status],StartTime,EndTime,StartTime AS TEST
      FROM dbo.MyTable
      WHERE StartTime BETWEEN '08:00:00' AND '08:40:00'
      ORDER BY StartTime DESC 
      UNION ALL
      SELECT TOP(1) [Status],StartTime,EndTime,EndTime AS TEST
      FROM dbo.MyTable
      WHERE
      EndTime BETWEEN '08:00:00' AND '08:40:00'
      ORDER BY EndTime DESC 
) x
ORDER BY TEST DESC

如果“第一条”记录只能由一个值确定,例如开始时间,只需执行以下操作:

SELECT TOP(1) [Status],StartTime,EndTime 
FROM dbo.MyTable
WHERE StartTime BETWEEN '08:00:00' AND '08:40:00'
OR EndTime BETWEEN '08:00:00' AND '08:40:00'
ORDER BY StartTime DESC
于 2012-05-27T04:34:39.930 回答