【问题标题】:MySQL Sum of field higher than x in date range with two date fields具有两个日期字段的日期范围中高于 x 的字段的 MySQL 总和
【发布时间】: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
...

到目前为止,我发现的是单个日期字段的解决方案,但我有两个:

现在我只能想到一个 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:002014-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 分钟时段的结果是什么?
  • 对不起,我将查询更改为一些伪代码循环。我希望这能把事情弄清楚一点。

标签: php mysql sql date yii


【解决方案1】:

这是一个经典的递归查询应用程序,遗憾的是 MySQL 不支持它。

取而代之的是,您需要做的是开发一系列时间戳,从表中找到的最早时间到最晚时间。使用过程或调用 MySQL 的另一种语言的代码来执行此操作。然后将您的表加入其中并找到最大值将是一件简单的事情。

【讨论】:

猜你喜欢
  • 2015-10-24
  • 2014-03-18
  • 1970-01-01
  • 2018-12-31
  • 2020-05-23
  • 2011-11-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多