Oracle将想要查询的时间点集合作为一个新表,去另一个表里只查询规定时间点的数据

发布时间 2023-04-18 09:08:34作者: 不爱上班的鹏子

最近遇到一个新需求,我们需要在一个表中选取特定时间段内一些固定时间点的数据(比如只想要取每个小时零点的数据),废物的我想不出来,让大佬教的,记录一下。

假如这个表长这样,名字就叫Table吧,需要取到每个小时零点的高度

 

TIME HEIGHT
2023-04-18 00:00:00 1
2023-04-18 01:00:00 2
2023-04-18 01:12:11 3
2023-04-18 01:43:00 4
2023-04-18 02:00:00 5

我们可以将我们想要查询的时间作为一个新表,然后联这个新表去查询当前数据库的时间,然后找出对应高度。

由开始时间和结束时间得到一个范围时间内的每小时的零点的新表,里面的字段取名叫做time_interval。

SELECT   

TRUNC(TO_DATE('2023-04-18 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 'hh24') + (LEVEL - 1) / 24 AS time_interval

FROM   DUAL   CONNECT   BY   LEVEL <= (TRUNC(TO_DATE('2023-04-18 03:00:00', 'yyyy-mm-dd hh24:mi:ss') , 'hh24') - TRUNC(TO_DATE('2023-04-18 00:00:00', 'yyyy-mm-dd hh24:mi:ss') , 'hh24')) * 24 + 1

然后用当前表联新表去一个一个查询里面的数据。

SELECT   T.HEIGHT , time_interval FROMTABLEt T  RIGHT JOIN (

SELECT   

TRUNC(TO_DATE('2023-04-18 00:00:00', 'yyyy-mm-dd hh24:mi:ss'), 'hh24') + (LEVEL - 1) / 24 AS time_interval

FROM   DUAL   CONNECT   BY   LEVEL <= (TRUNC(TO_DATE('2023-04-18 02:00:00', 'yyyy-mm-dd hh24:mi:ss') , 'hh24') - TRUNC(TO_DATE('2023-04-18 00:00:00', 'yyyy-mm-dd hh24:mi:ss') , 'hh24')) * 24 + 1

)  ON T.TIME = time_interval

这样我们就会得到一个高度与特定时间点的结果集辣!

 HEIGHT tme_interval 
 1  2023-04-18 00:00:00
 2  2023-04-18 01:00:00
 5  2023-04-18 02:00:00