MySQL:连续几次可用的时间跨度

时间:2015-01-22 16:36:08

标签: mysql time timespan difference

我有一个连续时间和日期的议程表。

ID  date        begin_time  end_time
1   05-02-15    19:00:00    19:05:00
2   05-02-15    19:05:00    19:10:00
3   05-02-15    19:10:00    19:15:00
4   05-02-15    19:15:00    19:20:00
5   05-02-15    19:20:00    19:25:00
6   05-02-15    19:25:00    19:30:00
7   05-02-15    19:30:00    19:35:00
8   05-02-15    19:35:00    19:40:00
9   06-02-15    19:00:00    19:05:00
10  06-02-15    19:05:00    19:10:00
11  06-02-15    19:10:00    19:15:00
12          
13          
14  06-02-15    19:25:00    19:30:00
15  06-02-15    19:30:00    19:35:00
16  06-02-15    19:35:00    19:40:00

http://sqlfiddle.com/#!2/54d9f6

正如您在05-02-15所见,从19:00到19:40的时间是连续的

正如您在06-02-15所见,从19:00到19:15的时间是连续的

正如您在06-02-15所见,从19:25到19:40的时间是连续的

开始时间和结束时间总是有5分钟差异。

我希望所有日期都有x分钟的连续时间。所以当x = 30时,结果为:

05-02-15

x = 10时,结果为:

05-02-15
06-02-15

方法的想法

也许第一步是获取所有连续的部分,其次是计算部分中的记录数(当x = 30时,我们需要至少30分钟/ 5分钟。= 6)。

2 个答案:

答案 0 :(得分:1)

用户变量在mysql中非常有用

SELECT date,MIN(CASE WHEN BEGIN!='00:00:00' THEN BEGIN END) m,
            MAX(CASE WHEN END!='00:00:00' THEN END END) mm
FROM
  ( SELECT BEGIN,END,date, CASE
                               WHEN
                           END = BEGIN +INTERVAL 5 MINUTE THEN @n ELSE @n:=@n+1 END AS g
   FROM agenda_specialists,
     (SELECT @n:=0) x
   ORDER BY id) s
GROUP BY date, g
HAVING ((TIME_TO_SEC(mm) - TIME_TO_SEC(m))/60)>=40

基本上你想检查开头是否等于结束+ 5分钟如果不是你增加一个变量你可以GROUP BY,它创建除了不同日期之外的间隔。其余的很容易。我不得不改变整理,由于某种原因,它给了我非法混合的整理。最后玩数字。

FIDDLE

编辑:

运行

SHOW VARIABLES LIKE '%char%';

您可能有character_set_server='latin1'

进入你的配置文件my.cnf并添加或取消注释这些行:

character-set-server = utf8
collation-server = utf8_general_ci

在我的机器5.5上测试

答案 1 :(得分:1)

此查询会检查您在下一个@x/5分钟内是否有@x个空闲广告位。如果是这样,那么它们覆盖整个@x分钟间隔,意味着它们是连续的。

set @x=15;
select distinct t1.date
from
    `agenda_specialists` as t1 join
    `agenda_specialists` as t2 on
        t2.date=t1.date and
        t2.begin>=t1.begin and
        t2.begin<addtime(t1.begin,sec_to_time(@x*60))
group by t1.id
having count(*)=@x/5

http://sqlfiddle.com/#!2/54d9f6/50