1

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

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

例如,假设我有下表:

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。

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

4

3 回答 3

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
于 2013-08-24T04:36:58.907 回答
2

非常简单的解决方案是使用DATE_FORMATMySQL 函数。

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

询问

SELECT
  DATE_FORMAT(`datef`, '%i') AS `Fields`,
  `datef`
FROM `dates`
WHERE DATE_FORMAT(`datef`, '%i') = 30
于 2013-08-24T04:49:59.740 回答
1

这应该有效。假设表被命名为“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);
于 2013-08-24T04:29:22.647 回答