在SQL Server 2008中基于时间检索行

时间:2012-05-27 03:46:10

标签: sql sql-server sql-server-2008

我有一个表格,除了其他列表,其中包含StartTimeEndTime类型的两列TimeStartTime。我想检索EndTimeID 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' 发生冲突。它应该返回第一行。

我试图这样做:

{{1}}

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

5 个答案:

答案 0 :(得分:4)

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

但事实上,你可以让事情变得更简单,而不是让你的情况变得更加简单:

SELECT *
FROM MyTable
WHERE StartTime <= '08:40:00'
  AND EndTime   >= '08:00:00'

答案 1 :(得分:2)

也许这实际上从未发生,但为了彻底,我还要检查范围'08:00:00'和'08:40:00'完全落在StartTime和EndTime之间的冲突,例如StartTime = 07:30:00和EndTime = 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
)

答案 2 :(得分:1)

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

答案 3 :(得分:1)

您的第二个条款应为EndTime BETWEEN '08:00:00' AND '08:40:00'。否则,你应该工作。

答案 4 :(得分:0)

要仅返回第一条记录,请在使用TOP 时使用ORDER BY确保包含TOP确定什么是'第一个'记录。 union是因为我假设'first'值可以由starttime或endtime确定。注意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

如果“第一个”记录只应由一个值确定,例如starttime,请执行以下操作:

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