6

データを 15 分のセグメント ( 1/4 時間)に集約したいと考えています。これを行うために、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上記の例から)。誰でも私を助けてもらえますか?

4

3 に答える 3

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;

デモ

于 2013-10-11T06:03:01.483 に答える
0
select TRUNC(SYSDATE,'HH24') + FLOOR((TRUNC(SYSDATE,'MI') - trunc(sysdate,'HH24'))*1440/:mi)*:mi/1440 FROM DUAL 
于 2014-07-09T15:42:48.080 に答える