我有一个表格,除了其他列表,其中包含StartTime
和EndTime
类型的两列Time
和StartTime
。我想检索EndTime
和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'
发生冲突。它应该返回第一行。
我试图这样做:
{{1}}
如果有人解决我的问题,我将非常感激。
答案 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