2013-10-11 18 views
6

Vorrei aggregare i miei dati in segmenti di 15 minuti (quarti dell'ora). Per fare ciò, ho scritto del codice che genera blocchi datetime di 15 minuti.Oracle PLSQL truncate datetimes a blocchi di 15 minuti

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 

Il problema con il mio codice è perché utilizza un troncamento un'ora, verrà generato solo data e ora dall'inizio della più recente ora. Ad esempio, è 11:49AM ora così il primo francobollo generato è 11:00AM.

ho bisogno di generare timbri dall'inizio dell'ultimo blocco 15 minute (11:45AM dall'esempio precedente). Qualcuno può aiutarmi?

+0

Vedere la * risposta corretta * [qui] (https://forums.oracle.com/thread/1008150?start=0&tstart=0) e regolare di conseguenza . –

+0

Il suo solo sql, non pl/sql – ajmalmhd04

risposta

7

Questo ti porterà nel quartiere più vicino.

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; 

uscita:

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 

Utilizzare questo come valore di partenza e poi iterare questo.

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

altro con 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

Per favore aggiungi alcuni dettagli sul tuo codice. – fxm

Problemi correlati