需要另外一张表,包括所有的时间段 比如
0:00 ,
1:00
2:00
...
23:00然后可以通过 left join 生成查询,之后,则可以根据起始时间来统计落在每时间段的时长统计。
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
0:00 ,
1:00
2:00
...
23:00然后可以通过 left join 生成查询,之后,则可以根据起始时间来统计落在每时间段的时长统计。
建议你列出你的表结构,并提供测试数据以及基于这些测试数据的所对应正确结果。
参考一下这个贴子的提问方式http://bbs.csdn.net/topics/320211382
1. 你的 create table xxx .. 语句
2. 你的 insert into xxx ... 语句
3. 结果是什么样,(并给以简单的算法描述)
4. 你用的数据库名称和版本(经常有人在MS SQL server版问 MySQL)
这样想帮你的人可以直接搭建和你相同的环境,并在给出方案前进行测试,避免文字描述理解上的误差。
解决方案 »
- 关于navicat for mysql里面表同步的问题
- 我的机子上没有安装mysql数据库,我现在想利用别人的机子上的数据库建立一个odbc数据源,请问应该怎么办啊
- 求指教,懂ip方面的进来(哎)
- 存储过程,如何使用prepare连接字符串参数
- 高负载下,Mysql表的读写性能问题,如何防止损坏
- 求助,查询多表里查询相同字段的相同内容
- mysql中类型为int的数据怎样自加1?
- 一张表不设立主键会有什么坏处?
- 人太笨,存储过程太罗嗦,那位大哥给精简下,谢谢!
- Windows 下安装mysql 配置的最大连接数是多少,急救急救急救
- 如何只连接服务器,不连接数据库?
- myeclipe 连接mysql 是不是配置问题啊??搞头痛了,,求大神!!
12:40 - 13:05 这个其实应该是算12点有20分钟,13点有5分钟,当然如果13点这个段后面有还有记录的的话(比如13:30-13:40) 那么13点这个就应该是5 + 10等于15分钟了.
[serial] integer PRIMARY KEY AUTOINCREMENT,
[RecDate] Date DEFAULT NULL,
[StartTime] Time DEFAULT NULL,
[EndTime] TIME);
insert into UsageHistory values ( 0, '2014-02-17', '07:55:00', '07:59:34' );
insert into UsageHistory values ( 1, '2014-02-17', '08:55:00', '08:59:34' );
insert into UsageHistory values ( 2, '2014-02-17', '09:45:00', '09:57:34' );
insert into UsageHistory values ( 3, '2014-02-17', '10:55:00', '11:20:34' );
insert into UsageHistory values ( 4, '2014-02-17', '12:10:00', '12:11:34' );
insert into UsageHistory values ( 5, '2014-02-17', '12:55:00', '12:59:34' );
insert into UsageHistory values ( 6, '2014-02-17', '13:55:00', '13:55:34' );
insert into UsageHistory values ( 7, '2014-02-17', '14:55:00', '14:59:34' );
insert into UsageHistory values ( 8, '2014-02-17', '15:55:00', '16:13:34' );
insert into UsageHistory values ( 9, '2014-02-17', '16:55:00', '16:59:34' );
insert into UsageHistory values ( 10, '2014-02-17', '17:55:00', '17:59:34' );
insert into UsageHistory values ( 11, '2014-02-17', '18:55:00', '18:59:34' );
insert into UsageHistory values ( 12, '2014-02-17', '19:55:00', '19:59:34' );
insert into UsageHistory values ( 13, '2014-02-18', '20:55:00', '20:59:34' );
insert into UsageHistory values ( 14, '2014-02-18', '21:55:00', '21:59:34' );
insert into UsageHistory values ( 15, '2014-02-18', '22:55:00', '22:59:34' );
insert into UsageHistory values ( 16, '2014-02-18', '23:55:00', '23:59:34' );
insert into UsageHistory values ( 17, '2014-02-18', '00:55:00', '00:59:34' );
insert into UsageHistory values ( 18, '2014-02-18', '01:55:00', '01:59:34' );
insert into UsageHistory values ( 19, '2014-02-18', '02:55:00', '02:59:34' );
insert into UsageHistory values ( 20, '2014-02-18', '03:55:00', '03:59:34' );
insert into UsageHistory values ( 21, '2014-02-18', '04:55:00', '04:59:34' );
insert into UsageHistory values ( 22, '2014-02-18', '05:55:00', '05:59:34' );
insert into UsageHistory values ( 23, '2014-02-18', '06:55:00', '06:59:34' );
insert into UsageHistory values ( 24, '2014-02-19', '07:55:00', '07:59:34' );
insert into UsageHistory values ( 25, '2014-02-19', '08:55:00', '08:59:34' );
insert into UsageHistory values ( 26, '2014-02-19', '09:55:00', '09:59:34' );
insert into UsageHistory values ( 27, '2014-02-19', '10:55:00', '10:59:34' );
insert into UsageHistory values ( 28, '2014-02-19', '11:55:00', '11:59:34' );
insert into UsageHistory values ( 29, '2014-02-19', '12:55:00', '12:59:34' );
insert into UsageHistory values ( 30, '2014-02-19', '13:55:00', '13:59:34' );
insert into UsageHistory values ( 31, '2014-02-19', '14:55:00', '14:59:34' );
create table A(s TIME , e TIME)
GO
insert into A
VALUES ('11:30','11:50'),( '12:40','13:05'),( '14:10','14: 20'),( '14:30','14:37')CREATE TABLE B (h INT,tm1 TIME,tm2 time)
GO
INSERT B VALUES(0,'0:00','1:00'),(1,'1:00','2:00'),(2,'2:00','3:00'),
(3,'3:00','4:00'),(4,'4:00','5:00'),(5,'5:00','6:00'),(6,'6:00','7:00'),
(7,'7:00','8:00'),(8,'8:00','9:00')
,(9,'9:00','10:00'),(10,'10:00','11:00'),(11,'11:00','12:00'),(12,'12:00','13:00'),
(13,'13:00','14:00'),(14,'14:00','15:00'),(15,'15:00','16:00')
GO
SELECT * FROM dbo.a,b WHERE a.e>b.tm1 AND a.s<b.tm2
结果
s e h tm1 tm2
11:30:00.0000000 11:50:00.0000000 11 11:00:00.0000000 12:00:00.0000000
12:40:00.0000000 13:05:00.0000000 12 12:00:00.0000000 13:00:00.0000000
12:40:00.0000000 13:05:00.0000000 13 13:00:00.0000000 14:00:00.0000000
14:10:00.0000000 14:20:00.0000000 14 14:00:00.0000000 15:00:00.0000000
14:30:00.0000000 14:37:00.0000000 14 14:00:00.0000000 15:00:00.0000000到了这一步,跨小时的问题就解决了,只要不是跨天就行
剩下的计算问题就简单了吧,数据库不一样函数也不同我就不写了
t1|t2
00:00:00|00:59:59
01:00:00|01:59:59
02:00:00|02:59:59
03:00:00|03:59:59
04:00:00|04:59:59
05:00:00|05:59:59
06:00:00|06:59:59
07:00:00|07:59:59
08:00:00|08:59:59
09:00:00|09:59:59
10:00:00|10:59:59
11:00:00|11:59:59
12:00:00|12:59:59
13:00:00|13:59:59
14:00:00|14:59:59
15:00:00|15:59:59
16:00:00|16:59:59
17:00:00|17:59:59
18:00:00|18:59:59
19:00:00|19:59:59
20:00:00|20:59:59
21:00:00|21:59:59
22:00:00|22:59:59
23:00:00|23:59:59
sqlite> select * from UsageHistory;
serial|RecDate|StartTime|EndTime
0|2014-02-17|07:55:00|07:59:34
1|2014-02-17|08:55:00|08:59:34
2|2014-02-17|09:45:00|09:57:34
3|2014-02-17|10:55:00|11:20:34
4|2014-02-17|12:10:00|12:11:34
5|2014-02-17|12:55:00|12:59:34
6|2014-02-17|13:55:00|13:55:34
7|2014-02-17|14:55:00|14:59:34
8|2014-02-17|15:55:00|16:13:34
9|2014-02-17|16:55:00|16:59:34
10|2014-02-17|17:55:00|17:59:34
11|2014-02-17|18:55:00|18:59:34
12|2014-02-17|19:55:00|19:59:34
13|2014-02-18|20:55:00|20:59:34
14|2014-02-18|21:55:00|21:59:34
15|2014-02-18|22:55:00|22:59:34
16|2014-02-18|23:55:00|23:59:34
17|2014-02-18|00:55:00|00:59:34
18|2014-02-18|01:55:00|01:59:34
19|2014-02-18|02:55:00|02:59:34
20|2014-02-18|03:55:00|03:59:34
21|2014-02-18|04:55:00|04:59:34
22|2014-02-18|05:55:00|05:59:34
23|2014-02-18|06:55:00|06:59:34
24|2014-02-19|07:55:00|07:59:34
25|2014-02-19|08:55:00|08:59:34
26|2014-02-19|09:55:00|09:59:34
27|2014-02-19|10:55:00|10:59:34
28|2014-02-19|11:55:00|11:59:34
29|2014-02-19|12:55:00|12:59:34
30|2014-02-19|13:55:00|13:59:34
31|2014-02-19|14:55:00|14:59:34
sqlite>sqlite> select t1,
...> sum(strftime('%s', min( hh.t2, EndTime ))-strftime('%s', max(hh.t1, StartTime)))/60.0 as d
...> from hh left join UsageHistory u on hh.t1<u.EndTime and hh.t2>u.StartTime
...> group by t1;
t1|d
00:00:00|4.56666666666667
01:00:00|4.56666666666667
02:00:00|4.56666666666667
03:00:00|4.56666666666667
04:00:00|4.56666666666667
05:00:00|4.56666666666667
06:00:00|4.56666666666667
07:00:00|9.13333333333333
08:00:00|9.13333333333333
09:00:00|17.1333333333333
10:00:00|9.55
11:00:00|25.1333333333333
12:00:00|10.7
13:00:00|5.13333333333333
14:00:00|9.13333333333333
15:00:00|4.98333333333333
16:00:00|18.1333333333333
17:00:00|4.56666666666667
18:00:00|4.56666666666667
19:00:00|4.56666666666667
20:00:00|4.56666666666667
21:00:00|4.56666666666667
22:00:00|4.56666666666667
23:00:00|4.56666666666667
sqlite>