问题:将Table1中的数据按照时间段以及其他可能的主键进行统计,然后转存到另一个表Table2中。
说明:时间段分类有两种,一是标准的按照分钟、小时、天等进行分段统计,二是用户自定义时间段,比如上午8点到11点,下午1点到5点。
原理:对时间粒度进行分类,相同的时间段内的时间取一个相同的标示,然后对其分组查询。
方法:对于第一类时间段,可以采用取分钟数,小时数,天数作为标示。
对于SQL Server,采用datediff(hour,'2007-5-17',Time)函数,可以使用minute,day等不同粒度。例如15分钟可以这样处理datediff(minute,'2007-5-17',myTime)/15,不要忘了反过来恢复时间时应该将该值再乘以15然后与标准时间'2007-5-17'相加 dateadd(minute,stime*15,'2007-5-17')。
对于Oracle,采用时间相减,得到一个小数,单位是天,乘以相关值再取整得到天数、小时数、分钟等,如
trunc((mytime-TO_DATE('2007-5-17 0:00:00','yyyy-mm-dd hh24:mi:ss'))*96)得到的是15分钟的分组标示。
对于第二类时间段,另建一个表,存储开始时间、结束时间、标示,然后利用该表联合查询。
注意:对于转存表中已经有相关数据可能造成失败的情况进行判别,防止出错。这样执行第二次,就不会再插入相同的数据了。
示例:
第一类解决方法:
1
1
第二类解决方法
不具体写了,因为要比上面的简单,这里就非常简单的表示一下查询原理,SQL Server
1
CREATE TABLE [dbo].[Table3] (
2
[starttime] [datetime] NULL ,
3
[endtime] [datetime] NULL ,
4
[id] [int] NULL --看你怎么用了,没有这个也可以
5
)
6
GO
7
8
delete from Table3;
9
10
insert into Table3 values('2007-5-17 0:0:0','2007-5-17 2:0:0',1);
11
insert into Table3 values('2007-5-17 3:0:0','2007-5-17 5:0:0',2);
12
GO
13
14
select id,ac,bi,sum(ci) cisum
15
from Table1,Table3 where ( myTime>=starttime and myTime<endTime)
16
group by id,ac,bi order by id
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17