MySQL: 连续时间可用的时间跨度
MySQL: a timespan available within consecutive times
我有一个 table 具有连续时间和日期的议程。
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)。
用户变量在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,它创建除了不同 date.The 的间隔之外是 easy.I 不得不更改排序规则,出于某种原因,它给了我非法混合 collation.Just 玩最后的数字。
编辑:
运行
SHOW VARIABLES LIKE '%char%';
你可能character_set_server='latin1'
进入您的配置文件,my.cnf 并添加或取消注释这些行:
character-set-server = utf8
collation-server = utf8_general_ci
在我的机器上测试 5.5
此查询检查您在接下来的 @x
分钟内是否有 @x/5
个空闲时段。如果是这样,则它们覆盖整个 @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
我有一个 table 具有连续时间和日期的议程。
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)。
用户变量在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,它创建除了不同 date.The 的间隔之外是 easy.I 不得不更改排序规则,出于某种原因,它给了我非法混合 collation.Just 玩最后的数字。
编辑:
运行
SHOW VARIABLES LIKE '%char%';
你可能character_set_server='latin1'
进入您的配置文件,my.cnf 并添加或取消注释这些行:
character-set-server = utf8
collation-server = utf8_general_ci
在我的机器上测试 5.5
此查询检查您在接下来的 @x
分钟内是否有 @x/5
个空闲时段。如果是这样,则它们覆盖整个 @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