查询数据库的时候 可以查询出每隔一段时间(比如2小时)这段时间段前3条数据

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了查询数据库的时候 可以查询出每隔一段时间(比如2小时)这段时间段前3条数据相关的知识,希望对你有一定的参考价值。

这个语句是不是办不到?有好的办法吗?
http://zhidao.baidu.com/question/585248685.html?quesup2&oldq=1

个人觉得难点在每隔2小时怎么取, 我的方式是取日期(0时0分0秒)然后加上小时数除以2作为标志每2小时的时间间隔(如果时间间隔不是整的小时, 且可以被24整除, 那么尚未想到好的方法); 而取前3条记录则有row_number分组函数可以使用.

示例(SQL Server 2005或以上)如下:

declare @tb table (ss int, dt datetime) -- 定义表变量
insert into @tb        -- 插入测试用数据
select 1, '2013/1/20 12:01'
union
select 7, '2013/1/20 12:01'
union
select 3, '2013/1/20 13:21'
union
select 8, '2013/1/20 13:13'
union
select 5, '2013/1/20 12:049'
-- 测试SQL, dt为时间值, hourSpan为分在哪个时间间隔内
select ss, dt, hourSpan
from (
-- 用row_number来按时间间隔分组编号, 且按ss字段升序编号
select ss, row_number() over (partition by convert(nvarchar(10), dt, 120) + '_' + cast(datepart(hour, dt) / 2 as nvarchar(2)) order by ss) as rownumber, dt, convert(nvarchar(10), dt, 120) + '_' + cast(datepart(hour, dt) / 2 as nvarchar(2)) as hourSpan
from @tb
) s
where s.rownumber <= 3 -- 取分组编号值小于等于3的记录

将这个逻辑套用过去, 大概能满足你的需求. 不过, 如果是经常执行这样的查询, 建议建一个字段存此时间间隔值或使用视图, 不然每次查询都有计算, 速度不好.

来自:求助得到的回答
参考技术A 怎么会办不到?
思路:
1,所谓间隔2小时,这个时间的相对值,首先要确定。比如:以上午8点开始,到晚上8点结束。
那么要查询的时间就是:
>= 8点 and < 10 点
>= 10点 and < 12 点
>= 12点 and < 14 点
>= 14点 and < 16 点
>= 16点 and < 18 点
>= 18点 and < 20 点
关键是,SQL语句中的Where子句,对日期/时间类型查询,要将该类值用#号引起来:
比如:
要返回10点到12点的前三条记录记录
"Select Top 3 * From 表2 Where 时间>=#10:00# and 时间<=#12:00:00# Order By 时间"追问

那我想查询2013年1月到2013年8月份的所有每隔2小时的数据 这个也把时间一一列出来???

追答

那要看你的具体要求?

追问

从时间2013年1月到2013年8月份 每隔2小时并且这两小时前3条记录显示出来 这个怎么写~·~

追答

思路:
1,做循环:按日期,时间,查询数据,把查到的记录,复制到一个表里
2,最后显示该表。

追问

好麻烦~·~ 运行时间已经够慢的了还要用循环啊?还得建立到表中 最后还要删除表~·~~·~ 还有循环语句可以在SQL语句中写不?最后让服务器返回结果~·~???

参考技术B select newtime,date,其他字段
from (
select convert(varchar(13) ,date, 120) newtime,date,其他字段,
rank() over (partition by convert(varchar(13) ,date, 120) order by date asc) rn
from table
where date between .... and ....
)
where rn<=3
order by 1
;

随便写个sqlserver的例子,如果是其他数据库可以再问,^_^
oracle的话更加简单追问

亲~·~ 稍微解释一下你的语句啊~·~ 说在rank()那里有错误 自己理解了下也百度了下语句 没有太明白~·~ 解释下吧~~·~~

追答

rank是分组排序的函数
把时间按小时分组后再按时间排序,取最小的三个
你是什么数据库

追问

SQL Server的数据库 你这个是每隔2小时取得数据吗?
我换一下问题~·~行不~~
每隔2小时取 这两小时中字段“ss”最小的数据

追答

隔2小时 就把小时除以2再分组就可以了

追问

好奇怪的查询结果~·~ 你能不能把QQ号码留下 我具体问问 如果不方便的话 那就继续在这里回答我的问题吧
那你能不能省去那些有的没的直接写一条语句来
我为这个语句愁死了要~~·~~
数据表里有“时间”字段记录着时间
查询时间在2013年1月到2013年8月份每隔2小时且 每2小时中第一个数据(因为不一定整点有数据)~·~

追答

--怎么又只要第一个数据了,你要自己学啊,给你了例子就要举一反三

select 日期,时间,其他字段
from (
select convert(varchar(13) ,date, 112) 日期,时间,其他字段,
rank() over (partition by substring(replace(replace(CONVERT(varchar, 时间,120 ),'-',''),' ',''),1,10)/2 order by 时间 asc) rn
from table
where 时间 between .... and ....
)
where rn<=1
order by 1,2
;

参考技术C 有时间间隔的执行,那肯定使用数据库的作业啦,你设置一个时间间隔,数据库自动帮你执行,还写啥sql,多低级啊

vue中如何每隔一段时间请求一次后台数据?

需求是这样的, 当天的每小时的零五分钟请求一次接口。

这个要怎么实现,比如一点的零五分钟,两点的零五分钟,三点的零五分钟...等等一直往后排。

这个功能怎么实现呢? 各位路过大神帮忙一下。。。

参考技术A 写一个定时任务就可以了
methods:
addTimer ()
var date = new Date()
if (date.getMinutes === 5)
setInterval(() =>
funABC().......
, 3900000)




mounted ()
var timer = setInterval(() =>
var date = new Date()
if (date.getMinutes === 5)
clearInterval(timer )
else
this.addTimer ()

)

以上是关于查询数据库的时候 可以查询出每隔一段时间(比如2小时)这段时间段前3条数据的主要内容,如果未能解决你的问题,请参考以下文章

vue中如何每隔一段时间请求一次后台数据?

利用jQuery Ajax技术实现每隔5秒向某页面传值

IIS每隔一段时间就无法进行访问,重启服务也不行,必须重启服务器才可以,请问是啥情况?如何解决?

VB如何利用timer每隔一段时间执行一个语句?

c#每隔一段时间执行一次函数

java中如何每隔一段时间执行一个函数