Oracle PLSQL将日期时间截断为15分钟

时间:2013-10-11 03:51:56

标签: sql oracle datetime plsql truncate

我想将我的数据汇总到15分钟段(一小时的时间)。为此,我编写了一些生成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)。有人可以帮帮我吗?

3 个答案:

答案 0 :(得分:8)

这将为您提供最近的一个季度。

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

答案 1 :(得分: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;

答案 2 :(得分:0)

select TRUNC(SYSDATE,'HH24') + FLOOR((TRUNC(SYSDATE,'MI') - trunc(sysdate,'HH24'))*1440/:mi)*:mi/1440 FROM DUAL