2013-10-11 13 views
6

データを15分セグメントに集計したいとします(時間の四半期)。これを行うために、私は15分のdatetimeブロックを生成するいくつかのコードを書いています。Oracle PLSQLはdatetimesを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

関連する問題