Oracle - Dias en las fechas

 
Vista:

Dias en las fechas

Publicado por Juan (22 intervenciones) el 10/05/2007 16:22:53
Que tal amigos, necesito que me apoyen con un query que necesito sacar, en donde realizo una diferencia entre dos columnas con datos tipo DATETIME, esto para tomar el tiempo que demora un servicio encolado.
Yo necesito que la informacion de esa diferencia se me presente DD H24:MI:SS, no se como hacerlo.
Encontre por allí un query que el formato que presenta es el siguiente:
TO_CHAR ( TO_DATE ('01', 'DD') + ( tiempo1 - tiempo2))
como podemos ver, inicializo el día en 1, para este caso. Pero existen transacciones que se realizan antes de completarse el el día (24 hrs encoladas), para estos casos quisiera que el día sea 00, porque en efecto, no ha ocurrido ningún día.
Cualquier ayuda o sugerencias son bien recibidas, sin más me despido y dandole las gracias de antemano por la ayuda que me puedan dar.
Es un query con un caracter de bastante urgencia.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Dias en las fechas

Publicado por Rodolfo Reyes (445 intervenciones) el 10/05/2007 21:19:04
Veo muy dificil que lo puedas hacer por medio de un query, yo en mi trabajo lo hago con una funcion.

Te pongo un ejemplo de de la idea de la función:

create table ddiff
(stdate date,
endate date);

insert into ddiff (stdate,endate) values
(to_date('01-jan-96 00:00:00','dd-mon-yy hh24:mi:ss'),
to_date('01-mar-97 01:01:01','dd-mon-yy hh24:mi:ss'));

insert into ddiff (stdate,endate) values
(to_date('01-jun-99 00:00:00','dd-mon-yy hh24:mi:ss'),
to_date('03-oct-99 02:02:02','dd-mon-yy hh24:mi:ss'));

set echo off
set serverout on

declare
cursor c1 is
select stdate,endate
from ddiff;

date_res number; end_now date; f_end_now char(20);
st_now date; temp_now date; f_st_now char(20);
yy_now number := 0;
mm_now number := 0;
dd_now number := 0;
hh_now number := 0;
f_hh_now number := 0;
mi_now number := 0;
f_mi_now number := 0;
ss_now number := 0;
f_ss_now number := 0;

begin
open c1;
loop

fetch c1 into st_now, end_now;
exit when c1%notfound;

-- Make st_now the earlier date
if (end_now < st_now) then
temp_now := end_now;
end_now := st_now;
st_now := temp_now;
end if;

f_end_now := to_char(end_now,'Mon-dd-yyyy hh24:mi:ss');
f_st_now := to_char(st_now,'Mon-dd-yyyy hh24:mi:ss');

yy_now := trunc(months_between(end_now,st_now)/12);
mm_now := mod(trunc(months_between(end_now,st_now)),12);
dd_now := trunc(end_now-add_months(st_now,months_between(end_now,st_now)));

date_res := (end_now-st_now);

hh_now := (date_res-floor(date_res))*24;
f_hh_now := trunc(hh_now);
mi_now := (hh_now-floor(hh_now))*60;
f_mi_now := trunc(mi_now);
ss_now := (mi_now-floor(mi_now))*60;
f_ss_now := round(ss_now);

dbms_output.put_line(chr(10)||
'The time difference between ');
dbms_output.put_line('starting date '||f_st_now);
dbms_output.put_line('and ending date '||
f_end_now||' is');
dbms_output.put_line(chr(10)||yy_now||' year(s), '||
mm_now||' month(s), '||dd_now||' day(s)');
dbms_output.put_line('and '||f_hh_now||' hour(s), '||
f_mi_now||' minute(s), '||
f_ss_now||' second(s)');
end loop;
close c1;
end;
/
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar