salida - Oracle PLSQL trunca las fechas en bloques de 15 minutos
procedimientos y funciones oracle pl/sql (3)
Me gustaría agregar mis datos en segmentos de 15 minutos ( cuartos de hora ). Para hacer esto, he escrito un código que genera bloques de fecha y hora de 15 minutos.
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
El problema con mi código es que utiliza un truncamiento de horas, solo generará marcas de tiempo desde el comienzo de la hora más reciente. Por ejemplo, son las 11:49AM
ahora, así que el primer sello generado es a las 11:00AM.
Lo necesito para generar sellos desde el comienzo del último bloque de 15 minutos ( 11:45AM
del ejemplo anterior). ¿Alguien puede ayudarme por favor?
Esto te dará el cuarto más cercano.
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;
Salida:
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
Use esto como su valor inicial y luego itere sobre esto.
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;
Otro 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;
select TRUNC(SYSDATE,''HH24'') + FLOOR((TRUNC(SYSDATE,''MI'') - trunc(sysdate,''HH24''))*1440/:mi)*:mi/1440 FROM DUAL