说三道四技术文摘-感悟人生的经典句子
说三道四 > 文档快照

问一个按时间查询问题!

编辑:说三道四文库 发布时间:2018-07-19 11:41
HTML文档下载 WORD文档下载 PDF文档下载
表的形式为:
mytable:
(id int,            
 starttm datetime,
 endtm,datetime
)
id          starttm                   endtm
1           2003-07-28 10:37:35.000   2003-07-28 10:37:39.000
2           2003-07-28 10:37:36.000   2003-07-28 10:37:45.000
3           2003-07-28 10:37:36.000   2003-07-28 10:38:55.000
4           2003-07-28 10:37:37.000   2003-07-28 10:39:25.000
5           2003-07-28 10:37:37.000   2003-07-28 10:37:39.000
6           2003-07-28 10:37:37.000   2003-07-28 10:37:45.000
.....................................

要求从starttm的最小时间开始,到endtm的最大时间结束,每隔两秒统计starttm<=抽样时间<=endtm的记录数,由于表比较大,使用临时表,一条条的统计添加速度太慢,请问一个高效率查询方法,谢谢!

这种方法太慢了:
declare @start datetime,@end datetime
declare @cnt int
set @start = (select min([starttm]) from mytable)
set @end   = (select max([endtm,]) from mytable)
drop table #result
create table #result
(
starttm datetime,
cnt     int
)
while(@start < @end)
begin
set @cnt = (select count(*) from mytable where [starttm] <= @start and @start <= [endtm] )
insert #result values (@start,@cnt)
set @start = dateadd(ss,2,@start)
end
select * from #result



1、建立序数表:
select top 10000 identity(int,0,2) id into 序数表 from sysobjects a,sysobjects b,sysobjects

2、
declare @start datetime,@end datetime, @cnt int

select @start=min([starttm]),@end=max([endtm]) from mytable

select *,(select sum(1) from mytable where [starttm]<=时间  and 时间<= [endtm]) 合计 from (
select dateadd(ss,id,@start) 时间 from 序数表 where dateadd(ss,id,@start)<=@end ) tem
declare @start datetime,@end datetime
declare @cnt int
set @start = (select min([starttm]) from mytable)
set @end   = (select max([endtm,]) from mytable)
drop table #result
create table #result
(
starttm datetime,
cnt     int
)
while(@start < @end)
begin
  insert #result values (@start, 0)
  set @start = dateadd(ss,2,@start)
end
update #result 
set cnt = (select count(*) from mytable 
             where A.starttm between [starttm] and [endtm])
from #result A
select * from #result
declare @start datetime,@end datetime
declare @cnt int
set @start = (select min([starttm]) from mytable)
set @end   = (select max([endtm,]) from mytable)
drop table #result
create table #result
(
starttm datetime,
cnt     int
)
while(@start < @end)
begin
  insert #result values (@start, 0)
  set @start = dateadd(ss,2,@start)
end
update #result 
set cnt = (select count(*) from mytable 
             where A.starttm between [starttm] and [endtm])
from #result A
select * from #result
非常感谢
能帮我解释一下序数表的作用么?
alter table tableName add id int identity(0,2)

select *,(select sum(1) from tableName where 时间 between [starttm] and [endtm]) cnt from (
select dateadd(ss,id,@start),* from tableName where dateadd(ss,id,@start)<=@end) tem

alter table tableName drop column id


create table test id int ,starttm datetime,endtm datetime 
insert into test
select 1,'2003-07-28 10:37:35.000','2003-07-28 10:37:39.000' 
union all
select 2,'2003-07-28 10:37:36.000','2003-07-28 10:37:45.000' 
union all
select 3,'2003-07-28 10:37:36.000','2003-07-28 10:38:55.000' 
union all
select 4,'2003-07-28 10:37:37.000','2003-07-28 10:39:25.000' 
union all
select 5,'2003-07-28 10:37:37.000','2003-07-28 10:37:39.000' 
union all
select 6,'2003-07-28 10:37:37.000','2003-07-28 10:37:45.000' 


alter table test add md int identity(0,2)
go
declare @start datetime,@end datetime
declare @cnt int
set @start = (select min([starttm]) from test)
set @end   = (select max([endtm]) from test)
select starttm,(select sum(1) from test where @start between [starttm] and [endtm]) cnt from (
select dateadd(ss,md,@start) as starttm from test where dateadd(ss,md,@start)<=@end) tem
go
alter table test drop column md
go
alter table test add md int identity(0,2)
go
declare @start datetime,@end datetime
declare @cnt int
set @start = (select min([starttm]) from test)
set @end   = (select max([endtm]) from test)
select *,(select sum(1) from test where 时间 between [starttm] and [endtm]) cnt from (
select dateadd(ss,md,@start) 时间 from test where dateadd(ss,md,@start)<=@end) tem
go
alter table test drop column md
go
to pengdali(大力 V2.0):
你的方法统计出来的结果有点不对
1、建立序数表:
select top 10000 identity(int,0,10000) id into 序数表 from sysobjects a,sysobjects b,sysobjects

2、
declare @start datetime,@end datetime, @cnt int

select @start=min([starttm]),@end=max([endtm]) from mytable
select (ss,aa.id,bb.startTime),(select count(*) from mytable where [starttm] <= @(ss,aa.id,bb.startTime) and @start <= [endtm] )
from 
序数表 aa left join (select @start as StartTime)bb on dateadd(ss,aa.id,bb.startTime)<=@end 
where bb.starttime is not null

备案号:鲁ICP备13029499号-2 说三道四 www.s3d4.cn 说三道四技术文摘