说我有一间名为尼亚加拉的会议室。我想找到谁在这个房间占用了开始和结束时间范围。表名是“niagara”。让我们今天继续搜索。
Person InTime OutTime
A 9AM 1PM
B 10AM 12PM
C 10:25AM 1:30PM
D 9AM 9:00 PM
E 12:20PM 5PM
F 10:45 AM 11:30 PM
列出上午10:30至下午12:15之间的人员名单
预期答案是 - A,BC,D和F
如何做到这一点
我试过
SELECT PERSON
FROM NIAGARA
WHERE (IN_TIME > START_TIME AND OUT_TIME < END_TIME)
OR (IN_TIME < START_TIME AND OUT_TIME > END_TIME)
BTW我在求职面试中被问过这个问题。
这意味着这就是我试图学习答案的方式
答案 0 :(得分:2)
基本逻辑是,如果in_time
小于期末并且out_time
在期间开始之后,则有人在场。那么,那将是:
SELECT PERSON
FROM NIAGARA
WHERE OUT_TIME > START_TIME AND IN_TIME < END_TIME;
您在Oracle中实际表达的方式取决于值的存储方式。如上所述,似乎它们存储为字符串。然后进行实际的比较需要更多的工作,但同样的逻辑仍然存在。
答案 1 :(得分:2)
检查重叠范围的常见逻辑是:
(start#1,end#2) overlaps (start#2,end#2)
start#1 <= end#2 AND end#1>= start#2
根据您的逻辑(包括开始和结束或仅包括一个),您可能需要将比较更改为
start#1 < end#2 AND end#1>= start#2
答案 2 :(得分:0)
试试这个:
SELECT PERSON
FROM NIAGARA
WHERE IN_TIME BETWEEN '10:30AM' and '12:15PM' AND OUT_TIME BETWEEN '10:30AM' and '12:15PM'
Shiv查看你给你的问题描述不应该返回任何结果,因为没有一行满足你的条件。
唯一满足条件InTime BETWEEN '10:30AM' and '12:15PM'
的inTime是F但是OutTime不满足条件OutTime BETWEEN '10:30AM' and '12:15PM'
满足条件OutTime BETWEEN '10:30AM' and '12:15PM'
的唯一OutTime是B但是inTime不满足条件InTime BETWEEN '10:30AM' and '12:15PM'