SqlServer 2005 求按时间间隔汇总, 例间隔为五分钟

0.要求

   开区间 (     闭区间]

   [0分 至 5分] 统计一条记录

   (5分 至 10分] 统计一条记录

   (10分 至 15分] 统计一条记录

   …

   (50分 至 59分] 统计一条记录

1.创建表

create table datas(
id int,
userid varchar(30),
data int,
rdate datetime
);
2.添加数据

insert into datas(id,userid,data,rdate) values(1,'1',1,'2009-10-26 16:01:00');
insert into datas(id,userid,data,rdate) values(2,'1',1,'2009-10-26 16:02:00');
insert into datas(id,userid,data,rdate) values(3,'1',1,'2009-10-26 16:03:00');
insert into datas(id,userid,data,rdate) values(4,'1',1,'2009-10-26 16:04:00');
insert into datas(id,userid,data,rdate) values(5,'1',1,'2009-10-26 16:05:00');
insert into datas(id,userid,data,rdate) values(6,'1',1,'2009-10-26 16:06:00');
insert into datas(id,userid,data,rdate) values(7,'1',1,'2009-10-26 16:08:00');
insert into datas(id,userid,data,rdate) values(8,'1',1,'2009-10-26 16:09:00');
insert into datas(id,userid,data,rdate) values(9,'1',1,'2009-10-26 16:10:00');
insert into datas(id,userid,data,rdate) values(10,'1',1,'2009-10-26 16:11:00');
insert into datas(id,userid,data,rdate) values(11,'1',1,'2009-10-26 16:15:00');
insert into datas(id,userid,data,rdate) values(12,'1',1,'2009-10-26 16:16:00');
insert into datas(id,userid,data,rdate) values(13,'1',1,'2009-10-27 16:01:00');
insert into datas(id,userid,data,rdate) values(14,'1',1,'2009-10-27 16:02:00');
insert into datas(id,userid,data,rdate) values(15,'1',1,'2009-10-27 16:03:00');
insert into datas(id,userid,data,rdate) values(16,'1',1,'2009-10-27 16:04:00');
insert into datas(id,userid,data,rdate) values(17,'1',1,'2009-10-27 16:05:00');
insert into datas(id,userid,data,rdate) values(18,'1',1,'2009-10-27 16:06:00');
insert into datas(id,userid,data,rdate) values(19,'1',1,'2009-10-27 16:56:00');
insert into datas(id,userid,data,rdate) values(20,'1',1,'2009-10-27 16:58:00');
insert into datas(id,userid,data,rdate) values(21,'1',1,'2009-10-27 17:00:00');

3.select SQL文

select userid,sum(data) as sum,
(
convert(varchar(10),datepart(yyyy,rdate)) + '-' + convert(varchar(10),datepart(m,rdate)) + '-' 
+ convert(varchar(10),datepart(d,rdate)) + ' ' + convert(varchar(10),datepart(hh,rdate)) + ':'
+ convert(varchar(10),
(case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end) * 5)
) as beginTime,
(
convert(varchar(10),datepart(yyyy,rdate)) + '-' + convert(varchar(10),datepart(m,rdate)) + '-' 
+ convert(varchar(10),datepart(d,rdate)) + ' ' + convert(varchar(10),
case
when
(((case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end) + 1) * 5) = 60
then
datepart(hh,rdate) + 1
when
(((case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end) + 1) * 5) != 60
then
datepart(hh,rdate)
end
) + ':'
+ convert(varchar(10),
(case
when
(((case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end) + 1) * 5) = 60
then 0
when
(((case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end) + 1) * 5) != 60
then 
(((case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end) + 1) * 5)
end)
)) as endTime from datas
group by userid,datepart(yyyy,rdate),datepart(m,rdate),datepart(d,rdate),
datepart(hh,rdate)
,
case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end
order by datepart(yyyy,rdate),datepart(m,rdate),datepart(d,rdate),
 datepart(hh,rdate),
case 
when (datepart(mi,rdate) / 5 = 0) then datepart(mi,rdate) / 5
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) = 5) then (datepart(mi,rdate) / 5) - 1
when (datepart(mi,rdate) / 5 > 0) and (datepart(mi,rdate) > 5) then  (datepart(mi,rdate) / 5)
end;

4.检索结果

SqlServer 2005 求按时间间隔汇总, 例间隔为五分钟_第1张图片

SqlServer 2005 求按时间间隔汇总, 例间隔为五分钟_第2张图片


你可能感兴趣的:(随意记录)