2013-10-11 166 views
6

我想将我的数据汇总为1​​5分钟段(小时的季度)。为此,我编写了一些生成15分钟日期时间块的代码。Oracle PLSQL将日期时间截断为15分钟块

SELECT 
    TRUNC(SYSDATE,'hh') + 0.25/24 - (ROWNUM) *0.25/ 24 
    AS time_start, 
    ROWNUM, 
    TRUNC(SYSDATE,'hh') + 0.25/24 - (ROWNUM - 1) *0.25/ 24 
    AS time_end 
FROM widsys.consist 
WHERE ROWNUM <3000 
ORDER BY sysdate 

我的代码的问题是因为它使用小时截断,它只会从最近的小时开始生成时间戳。例如,现在是11:49AM,所以生成的第一个邮票是11:00AM.

我需要它从最后15分钟块(上面的示例中的11:45AM)开始生成邮票。谁能帮帮我吗?

+0

见*正确答案* [这里](https://forums.oracle.com/thread/1008150?start=0&tstart=0),并相应调整。 –

+0

其唯一的sql,而不是pl/sql – ajmalmhd04

回答

7

这将使您获得最接近的四分之一。

select sysdate, 
     trunc(sysdate,'mi') -       --truncate to the nearest minute 
     numtodsinterval(        --convert the minutes in number to interval type and subtract. 
         mod(to_char(sysdate,'mi'),15), --find the minutes from the nearest quarter 
         'minute'       
        ) as nearest_quarter 
    from dual; 

输出:

sysdate        nearest_quarter 
----------------------------------------------------------------- 
October, 11 2013 05:54:24+0000  October, 11 2013 05:45:00+0000 
October, 11 2013 05:22:24+0000  October, 11 2013 05:15:00+0000 

使用此为您的初始值,然后遍历这个。

with cte as(
    select trunc(sysdate,'mi') - 
     numtodsinterval(mod(to_char(sysdate,'mi'),15),'minute') as nearest_quarter 
    from dual 
) 
select nearest_quarter - numtodsinterval((level - 1)*15, 'minute'), 
     nearest_quarter - numtodsinterval((level - 2)*15, 'minute') 
from cte 
connect by level <= 10; 

Demo

3

另一个与WIDTH_BUCKET:

SELECT trunc(SYSDATE, 'hh')+ (width_bucket(to_number(to_char(SYSDATE, 'mi')), 0 , 60, 4)-1)*15/(24*60) x 
FROM dual; 
0
select TRUNC(SYSDATE,'HH24') + FLOOR((TRUNC(SYSDATE,'MI') - trunc(sysdate,'HH24'))*1440/:mi)*:mi/1440 FROM DUAL 
+0

请在你的代码中添加一些细节。 – fxm

相关问题