【问题标题】:Count only rows with 30 minutes between each other? [duplicate]只计算彼此之间有 30 分钟的行吗? [复制]
【发布时间】:2013-08-24 03:53:51
【问题描述】:

我正在尝试最有效的方法来计算 MySQL 表中的特定行数。

我的表包含一个名为date_timedatetime 列,我想计算每个date_time 之间至少间隔30 分钟的行数。

例如,假设我有下表:

id    date_time
1     2013-08-23 00:30:00    
2     2013-08-23 00:45:00    
3     2013-08-23 01:01:00    
4     2013-08-23 02:30:00    
5     2013-08-23 02:45:00

如果我只想在距上次条目至少 30 分钟后包含一个条目,则计数将包括 id #1 和 id #4,因此计数将为 2。

我正在尝试编写一个干净的脚本来执行此操作,是否有任何特殊类型的查询可以帮助我完成此操作?

【问题讨论】:

  • 您的意思是 30 秒吗?因为您的数据肯定是在几秒钟内。
  • 你的意思是第一次进入吗?当您的意思是“因此计数为 2”时,您的意思是要将其限制为 2 个结果吗?因为我不知道你会如何只选择 id 1 和 id 4,因为在 id 1 之后还有 30 秒以上。
  • @Prix 啊我的意思是分钟,我很抱歉。我会立即更新。谢谢迈克,该表有数千行,所以我不想限制为两个。我的意思也是分钟...
  • 您是否只对“这一行下一行之间的30分钟”感兴趣?例如,在上面的示例数据中,只有行 id 3 是有效结果?这是一个正确的假设吗?

标签: php mysql


【解决方案1】:

对此非常简单的解决方案是使用DATE_FORMAT MySQL 函数。

http://sqlfiddle.com/#!2/3b793/4

查询

SELECT
  DATE_FORMAT(`datef`, '%i') AS `Fields`,
  `datef`
FROM `dates`
WHERE DATE_FORMAT(`datef`, '%i') = 30

【讨论】:

  • 它对你有用吗..?
  • 这只会在几分钟内输出所有带有“30”的条目 - 比如 11:30:56、12:30:23 等...这个答案怎么会有 2 个赞?
【解决方案2】:

您可以使用 MySQL 变量 (SQLFiddle):

SET @x := NULL;
SELECT count(*) FROM (
    SELECT @x AS prev, @x:=date_time AS curr
    FROM mytable
    ORDER BY id
) y
WHERE curr > prev + interval 30 minute
   OR curr < prev

【讨论】:

    【解决方案3】:

    这应该可行。假设表名为“time_list”,ids和times是连续的……

    SELECT
      count(1)
    FROM `time_list`
      LEFT OUTER JOIN `time_list` AS `a`
        ON (`time_list`.`id` = (`a`.`id` + 1))
    WHERE (
      (to_seconds(`time_list`.`date_time`) - to_seconds(`a`.`date_time`)) / 60 >= 30
      OR `a`.`id` IS null);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-03-22
      • 2019-09-28
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      • 2023-02-20
      • 2012-02-19
      • 2011-10-04
      相关资源
      最近更新 更多