tipos salida procedimientos procedimiento parametros funciones example ejemplos ejecutar developer con bloques bloque anonimo almacenado sql oracle datetime plsql truncate

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;

Demo


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