最近遇到一个新需求,我们需要在一个表中选取特定时间段内一些固定时间点的数据(比如只想要取每个小时零点的数据),废物的我想不出来,让大佬教的,记录一下。
假如这个表长这样,名字就叫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 |