【发布时间】:2014-03-28 09:54:07
【问题描述】:
DI 一直在搜索 stackoverflow,但找不到解决我的问题的方法。
我需要检查具有两个日期字段的事件表中所有参与者的总和是否高于 X。到目前为止没问题,但它来了。我需要在 5 分钟的时间间隔内获得最大的参与者总数。
我的客户需要知道在给定日期范围内的任何时间点,他家中的人数是否超过了允许的人数。
事件表:
id start_date end_date participants
1 2014-03-12 10:00:00 2014-03-12 20:00:00 10
2 2014-03-01 12:30:00 2014-03-14 21:53:00 43
3 2014-02-12 10:00:00 2014-03-13 20:00:00 21
4 2014-05-30 10:00:00 2014-05-30 20:00:00 54
...
到目前为止,我发现的是单个日期字段的解决方案,但我有两个:
- Grouping into interval of 5 minutes within a time range
- SELECT / GROUP BY - segments of time (10 seconds, 30 seconds, etc)
现在我只能想到一个 php 循环来查询这个,但我认为这在一个日期范围内可能有数千次迭代不会很聪明。我也可以想到一个 MySQL FOR-Loop,但我不知道如何在日期范围内执行此操作。
有人知道这个问题的解决方案吗?这甚至可以通过 MySQL 实现吗?
提前致谢。
编辑:
可能的伪查询是这样的:
DATE_END = 2014-03-31 20:00:00
DATE_START = 2014-03-01 10:00:00
WHILE (DATE_START < DATE_END) {
SELECT SUM(participants)
FROM events WHERE start_date <= DATE_START + 5 minutes
AND end_date >= DATE_START
IF (participants > MAX_PARTICIPANTS) {
MAX_PARTICIPANTS = participants
}
DATE_START + 5 minutes;
}
结果应该是这样的:
Maximum simultaneous participants: 74
【问题讨论】:
-
您能否给出您期望从数据中得到的示例结果?更清楚地定义你所说的五分钟间隔是什么意思? (您是将一个小时分成 12 个固定的 5 分钟块,还是任何个连续的 5 分钟时间段,例如
21:48:36 to 21:53:36?) 另外,有多少参与者你认为有从2014-03-14 21:50:00到2014-03-14 21:55:00吗? (您的数据有 3 分钟的 43 名参与者和 2 分钟的 0 名参与者。) -
感谢您的回答。我在我的问题中添加了一个示例“查询”。
-
“10”12日参加。 '21'11日停止参加。那么你如何得到“74”?
-
您还没有定义“日期范围内每 5 分钟”。你的意思是“00:00 - 00:05”然后是“00:05 - 00:10”等?或者您的意思是“00:00 - 00:05”然后是“00:01 - 00:06”等?或者也许是一样的,但一秒一秒?并且,如果一个 5 分钟的时段有 43 名参与者持续 3 分钟,0 名参与者持续 2 分钟,那么这 5 分钟时段的结果是什么?
-
对不起,我将查询更改为一些伪代码循环。我希望这能把事情弄清楚一点。