SQL查询:确定在特定时间范围内占用房间的人员

时间:2016-02-04 18:31:57

标签: sql oracle

说我有一间名为尼亚加拉的会议室。我想找到谁在这个房间占用了开始和结束时间范围。表名是“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我在求职面试中被问过这个问题。

这意味着这就是我试图学习答案的方式

3 个答案:

答案 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'