SQL数据库按时间间隔查询记录

时间:2022-07-11 11:13:04
我在数据库查询中,实现任意一段时间内,间隔任意一时间段查询数据。比如2008-1-3 13:47:00至2008-1-3 13:55:00之间的时间,查询间隔2分钟的数据,
既查询13:47:00、13:49:00、13:51:00、13:53:00、13:55:00时间对应的数据。

8 个解决方案

#1



--这样??

--这个按每五分钟的,你稍微改改就行了.
[code=SQL]create table tb(时间 datetime , 金额 int)
insert into tb values('2007-1-1 10:00:23' ,          8 )
insert into tb values('2007-1-1 10:01:24' ,          4 )
insert into tb values('2007-1-1 10:05:00' ,          2 )  
insert into tb values('2007-1-1 10:06:12' ,          3 )
insert into tb values('2007-1-1 10:08:00' ,          1 )
insert into tb values('2007-1-1 10:12:11' ,          5 )
go

--时间段>=10:00:00 and 时间段<10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
       count(*) as 行数,
       sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120))
/*
时间段                                                    行数          总金额         
------------------------------------------------------ ----------- ----------- 
2007-01-01 10:00:00.000                                3           14
2007-01-01 10:05:00.000                                2           4
2007-01-01 10:10:00.000                                1           5
(所影响的行数为 3 行)
*/

--时间段>10:00:00 and 时间段<=10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
       count(*) as 行数,
       sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120))
/*
时间段                                                    行数          总金额         
------------------------------------------------------ ----------- ----------- 
2007-01-01 10:00:00.000                                2           12
2007-01-01 10:05:00.000                                3           6
2007-01-01 10:10:00.000                                1           5

(所影响的行数为 3 行)
*/

drop table tb

#2


引用楼主 mojifeng 的帖子:
我在数据库查询中,实现任意一段时间内,间隔任意一时间段查询数据。比如2008-1-3 13:47:00至2008-1-3 13:55:00之间的时间,查询间隔2分钟的数据, 
既查询13:47:00、13:49:00、13:51:00、13:53:00、13:55:00时间对应的数据。 



参考.

#3



create procedure prco_getResult
@beginDate datetime,
@endDate datetime
as
begin
create table #1(id int identity(1,1),dd datetime)

while @endDate > @beginDate
begin
insert #1 values(@beginDate)
set @beginDate = dateadd(mi,2,@beginDate)
end

select * from tb a join #1 b on a.date = b.dd

end

#4


都没有数据源吗?
不知道楼主这样做的用意是什么?

#5


select * from a where todate between '2008-01-03 13:47:00' and '2008-1-3 13:55:00'
and datediff(mi,'2008-01-03 13:47:00',todate) % 2=0

#6


1楼的PL_MM又从哪里拷贝我的代码?

#7


楼上是天神
问个问题好吗
有个日志表如下

时间     用户      动作
XX      XX      XX 




我想查询某个时间某个用户做了什么动过
或者某个特定动作都有哪些人做过,都在什么时间
该怎么做呢

#8


a

#1



--这样??

--这个按每五分钟的,你稍微改改就行了.
[code=SQL]create table tb(时间 datetime , 金额 int)
insert into tb values('2007-1-1 10:00:23' ,          8 )
insert into tb values('2007-1-1 10:01:24' ,          4 )
insert into tb values('2007-1-1 10:05:00' ,          2 )  
insert into tb values('2007-1-1 10:06:12' ,          3 )
insert into tb values('2007-1-1 10:08:00' ,          1 )
insert into tb values('2007-1-1 10:12:11' ,          5 )
go

--时间段>=10:00:00 and 时间段<10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
       count(*) as 行数,
       sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,-1,时间),120),dateadd(ss,-1,时间))/5)*5,convert(varchar(10),时间,120))
/*
时间段                                                    行数          总金额         
------------------------------------------------------ ----------- ----------- 
2007-01-01 10:00:00.000                                3           14
2007-01-01 10:05:00.000                                2           4
2007-01-01 10:10:00.000                                1           5
(所影响的行数为 3 行)
*/

--时间段>10:00:00 and 时间段<=10:05:00
select dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120)) as 时间段,
       count(*) as 行数,
       sum(金额) as 总金额
from tb
group by dateadd(mi,(datediff(mi,convert(varchar(10),dateadd(ss,1,时间),120),dateadd(ss,1,时间))/5)*5,convert(varchar(10),时间,120))
/*
时间段                                                    行数          总金额         
------------------------------------------------------ ----------- ----------- 
2007-01-01 10:00:00.000                                2           12
2007-01-01 10:05:00.000                                3           6
2007-01-01 10:10:00.000                                1           5

(所影响的行数为 3 行)
*/

drop table tb

#2


引用楼主 mojifeng 的帖子:
我在数据库查询中,实现任意一段时间内,间隔任意一时间段查询数据。比如2008-1-3 13:47:00至2008-1-3 13:55:00之间的时间,查询间隔2分钟的数据, 
既查询13:47:00、13:49:00、13:51:00、13:53:00、13:55:00时间对应的数据。 



参考.

#3



create procedure prco_getResult
@beginDate datetime,
@endDate datetime
as
begin
create table #1(id int identity(1,1),dd datetime)

while @endDate > @beginDate
begin
insert #1 values(@beginDate)
set @beginDate = dateadd(mi,2,@beginDate)
end

select * from tb a join #1 b on a.date = b.dd

end

#4


都没有数据源吗?
不知道楼主这样做的用意是什么?

#5


select * from a where todate between '2008-01-03 13:47:00' and '2008-1-3 13:55:00'
and datediff(mi,'2008-01-03 13:47:00',todate) % 2=0

#6


1楼的PL_MM又从哪里拷贝我的代码?

#7


楼上是天神
问个问题好吗
有个日志表如下

时间     用户      动作
XX      XX      XX 




我想查询某个时间某个用户做了什么动过
或者某个特定动作都有哪些人做过,都在什么时间
该怎么做呢

#8


a