【发布时间】:2021-01-27 20:36:02
【问题描述】:
由于目前的限制,我们有一个房间只能容纳 XX 人。他们来的时间不同,停留的时间也不同。
我正在尝试在特定日期的每 15 分钟内获取当前内部人员的总和。服务器是部署在 AWS RDS 上的 MySQL 8.0.21。
MySQL 8.0 表:预订
| ID | Name | PartySize | Date | BookedFrom | BookedTo |
|---|---|---|---|---|---|
| 1 | John | 2 | 2021-01-01 | 2021-01-01 08:30:00 | 2021-01-01 10:00:00 |
| 2 | Mary | 4 | 2021-01-01 | 2021-01-01 09:00:00 | 2021-01-01 11:00:00 |
| 3 | Nick | 3 | 2021-01-01 | 2021-01-01 10:30:00 | 2021-01-01 12:30:00 |
我还有一个“帮助表”,每 24 小时 15 分钟有一个时间段
MySQL 表:时隙
| ID | Time |
|---|---|
| 1 | 00:00:00 |
| 2 | 00:15:00 |
| 3 | 00:30:00 |
| 35 | 08:30:00 |
| 37 | 09:00:00 |
| 38 | 09:15:00 |
例如,当我在下面运行此查询时,我将获得 09:30 的正确人数(6 人)。对于每个 15 分钟的时段,获得此结果的最有效方法是什么?请注意,虽然BookedTo(日期时间字段)的值可能超过午夜,但我将始终只进行特定日期的查询。
SELECT
t.id, b.date, t.time, SUM(b.partysize) AS total
FROM
booking b,
timeslot t
WHERE
b.date = '2021-01-01'
AND t.time = '09:15:00'
AND b.bookedfrom <= '2021-01-01 09:15:00'
AND b.bookedto >= '2021-01-01 09:15:00'
一直在寻找这个输出(包括零)
| Slot_ID | Date | Time | Total |
|---|---|---|---|
| 33 | 2021-01-01 | 08:00:00 | 0 |
| 34 | 2021-01-01 | 08:15:00 | 0 |
| 35 | 2021-01-01 | 08:30:00 | 2 |
| 36 | 2021-01-01 | 08:30:00 | 2 |
| 37 | 2021-01-01 | 09:00:00 | 6 |
| 38 | 2021-01-01 | 09:15:00 | 6 |
【问题讨论】:
-
您使用的是 MySQL 还是 Oracle?
-
您通常 GROUP BY 与您选择的列相同,但那些作为设置函数的参数的列除外。
-
@jarlh 我正在使用 MySQL 服务器
-
你必须使用
LEFT JOIN来获得零和。 -
为什么要在分组中除以 900?时隙表已经以 15 分钟为边界。