如何创建检查时间重叠的查询?
How do I create a query that checks time overlaps?
假设我想编写一个查询来查找在任意时间段有空的所有教授。我有 table 个教授,每个教授都有空的时间。
教授 table 为每位教授创建了一个条目,其中包含他们的姓名和他们忙碌的时间段(因此具有多个忙碌时间段的教授将有多个条目)。
我的问题是,如果一位教授在特定时间段 x 已经很忙,并且在另一个时间段 y 也很忙,那么 return 教授可以为 x 提供服务,因为 y 不会干扰.
假设我需要找到一份中午 12 点有空的教授名单。琼斯教授中午12点很忙,下午2点也很忙。我对 return 的琼斯教授提出的每个查询都可用于中午 12 点时段,因为它看到下午 2 点的条目并且知道那不重叠。 (尽管实际查询需要通用,所以它会遍历时间段列表并且 return 是一个大的 table,每个时间段和每个教授在该时间段可用,而不是 SELECT time WHERE time = "12"
)
根据您的描述和评论,我假设您具有以下 table 结构:
professor
- name string
- start datetime
- end datetime
根据您的描述,不清楚查询的输入是单个时间点还是 运行ge 时间。然后你继续提到解决方案需要 'generic' 才能通过 'the list of time slots'。这个列表是什么?你从哪里得到它?为了获得更详尽的答案,我需要你给我一个更好的描述。
但现在,我假设查询的输入是一个名为 $checktime 的日期时间值,并且您正在尝试查找在那个确切时刻有空的教授列表时间。将其更改为 运行ge 的时间应该相当简单。
根据您对当前查询问题的描述,听起来当前查询是这样的:
SELECT DISTINCT name
FROM professor
WHERE $checktime < start
OR $checktime > end
如果您有两个条目,(Jones, 12pm, 1pm) 和 (Jones, 2pm, 3pm),并且 运行 该查询使用 $checktime=12pm,where 子句将过滤掉第一个条目,但第二个条目将保留,将琼斯留在结果 table 中。这似乎与您提供的描述相符。
这里的技巧是找到当时忙碌的所有教授的列表,然后使用该列表找到当时不忙的教授。
例如,从以下查询开始,它基本上与您当前的查询相反。
SELECT DISTINCT name
FROM professor
WHERE $checktime >= start
AND $checktime <= end
这将为您提供在给定时间忙碌的所有教授的名单。然后您可以获得所有教授的列表并使用 MINUS 删除先前查询中包含的条目:
(
-- The list of all professors
SELECT DISTINCT name
FROM professor
)
MINUS
(
-- The list of all professors who are busy at the given time slot.
SELECT DISTINCT name
FROM professor
WHERE $checktime >= start
AND $checktime <= end
)
剩下的教授都是在给定时间不忙的教授。
我对 MS Access 不熟悉,但如果它恰好是不支持 MINUS 的数据库引擎之一,你可以改为执行以下操作,这在逻辑上是等效的(假设 table professor 限制 name 不为空),但可读性差很多:
SELECT DISTINCT all_profs.name
FROM professor as all_profs
LEFT JOIN
(SELECT DISTINCT name
FROM professor
WHERE $checktime >= start
AND $checktime <= end
) as busy_profs
ON all_profs.name = busy_profs.name
WHERE busy_profs.name IS NULL
作为旁注,您应该考虑更改您的 table 结构,以便忙碌时间与教授分开 table,例如新的 table 称为 busy_times 有 3 列:教授(教授的外键 table)、开始和结束。这是因为,据推测,您掌握的关于教授的信息不仅仅是他们的名字,而且大多数教授都会有很多忙碌的时间。这会导致大量重复信息,这很糟糕,原因有二。首先,它占用的 space 比应有的多得多。其次,维护起来非常麻烦。如果教授结婚并改名会怎样?您将不得不更改每个条目,如果您遗漏了一个条目,可能会导致问题。
假设我想编写一个查询来查找在任意时间段有空的所有教授。我有 table 个教授,每个教授都有空的时间。
教授 table 为每位教授创建了一个条目,其中包含他们的姓名和他们忙碌的时间段(因此具有多个忙碌时间段的教授将有多个条目)。
我的问题是,如果一位教授在特定时间段 x 已经很忙,并且在另一个时间段 y 也很忙,那么 return 教授可以为 x 提供服务,因为 y 不会干扰.
假设我需要找到一份中午 12 点有空的教授名单。琼斯教授中午12点很忙,下午2点也很忙。我对 return 的琼斯教授提出的每个查询都可用于中午 12 点时段,因为它看到下午 2 点的条目并且知道那不重叠。 (尽管实际查询需要通用,所以它会遍历时间段列表并且 return 是一个大的 table,每个时间段和每个教授在该时间段可用,而不是 SELECT time WHERE time = "12"
)
根据您的描述和评论,我假设您具有以下 table 结构:
professor
- name string
- start datetime
- end datetime
根据您的描述,不清楚查询的输入是单个时间点还是 运行ge 时间。然后你继续提到解决方案需要 'generic' 才能通过 'the list of time slots'。这个列表是什么?你从哪里得到它?为了获得更详尽的答案,我需要你给我一个更好的描述。
但现在,我假设查询的输入是一个名为 $checktime 的日期时间值,并且您正在尝试查找在那个确切时刻有空的教授列表时间。将其更改为 运行ge 的时间应该相当简单。
根据您对当前查询问题的描述,听起来当前查询是这样的:
SELECT DISTINCT name
FROM professor
WHERE $checktime < start
OR $checktime > end
如果您有两个条目,(Jones, 12pm, 1pm) 和 (Jones, 2pm, 3pm),并且 运行 该查询使用 $checktime=12pm,where 子句将过滤掉第一个条目,但第二个条目将保留,将琼斯留在结果 table 中。这似乎与您提供的描述相符。
这里的技巧是找到当时忙碌的所有教授的列表,然后使用该列表找到当时不忙的教授。
例如,从以下查询开始,它基本上与您当前的查询相反。
SELECT DISTINCT name
FROM professor
WHERE $checktime >= start
AND $checktime <= end
这将为您提供在给定时间忙碌的所有教授的名单。然后您可以获得所有教授的列表并使用 MINUS 删除先前查询中包含的条目:
(
-- The list of all professors
SELECT DISTINCT name
FROM professor
)
MINUS
(
-- The list of all professors who are busy at the given time slot.
SELECT DISTINCT name
FROM professor
WHERE $checktime >= start
AND $checktime <= end
)
剩下的教授都是在给定时间不忙的教授。
我对 MS Access 不熟悉,但如果它恰好是不支持 MINUS 的数据库引擎之一,你可以改为执行以下操作,这在逻辑上是等效的(假设 table professor 限制 name 不为空),但可读性差很多:
SELECT DISTINCT all_profs.name
FROM professor as all_profs
LEFT JOIN
(SELECT DISTINCT name
FROM professor
WHERE $checktime >= start
AND $checktime <= end
) as busy_profs
ON all_profs.name = busy_profs.name
WHERE busy_profs.name IS NULL
作为旁注,您应该考虑更改您的 table 结构,以便忙碌时间与教授分开 table,例如新的 table 称为 busy_times 有 3 列:教授(教授的外键 table)、开始和结束。这是因为,据推测,您掌握的关于教授的信息不仅仅是他们的名字,而且大多数教授都会有很多忙碌的时间。这会导致大量重复信息,这很糟糕,原因有二。首先,它占用的 space 比应有的多得多。其次,维护起来非常麻烦。如果教授结婚并改名会怎样?您将不得不更改每个条目,如果您遗漏了一个条目,可能会导致问题。