Oracle Convierte Segundos a Horas:Minutos:Segundos

Tengo un requisito para mostrar el tiempo disponible del usuario en formato Horas: Minutos: Segundos a partir de un valor de número total dado de segundos. Aprecie si conoce una función ORACLE para hacer lo mismo. Estoy usando Oracle.

Gracias por tu tiempo.

preguntado el 12 de junio de 12 a las 20:06

14 Respuestas

Si solo está buscando convertir una cantidad determinada de segundos en formato HH: MI: SS, esto debería hacerlo

SELECT 
    TO_CHAR(TRUNC(x/3600),'FM9900') || ':' ||
    TO_CHAR(TRUNC(MOD(x,3600)/60),'FM00') || ':' ||
    TO_CHAR(MOD(x,60),'FM00')
FROM DUAL

sin que importe x es el número de segundos.

respondido 07 nov., 12:22

Esto funciona bien. Pero si las horas son > 99 horas, entonces no funciona correctamente. user1430989

Vea mi edición usando TO_CHAR en lugar de LPAD. Debería manejar hasta 9999 horas ahora. Si necesita más que eso, puede agregar 9 adicionales a la cadena de formato en la primera función TO_CHAR. - Mike

Esto no está funcionando correctamente para el siguiente caso: SELECT TO_CHAR(TRUNC(76014000/3600),'FM999999900') || 'Horas' || TO_CHAR(TRUNC(MOD(76014000,3600)/60),'FM00') || 'Min' DESDE DUAL; - nishanti grashia

@Nisha: ejecutar su consulta me dio 21115Hrs 00Min ... me parece correcto. - Mike

@Mike: la respuesta esperada era 21.115 horas. Pero la consulta devolvió 21115 horas. Acabo de darme cuenta de que estaba usando Milli segundos. La consulta funciona bien. Tendré que convertir los milisegundos a segundos y reemplazarlo en lugar de X y funciona... ¡¡Gracias!! - nishanti grashia

Prueba este. Muy simple y facil de usar

select to_char(to_date(10000,'sssss'),'hh24:mi:ss') from dual;

Respondido 23 Oct 12, 13:10

Me gusta más esto que mi respuesta, pero no funciona durante más de 86399 segundos (1 día). - Mike

Solución perfecta - TroniPM

El siguiente código es menos complejo y da el mismo resultado. Tenga en cuenta que 'X' es el número de segundos que se convertirán en horas.

En el uso de Oracle:

SELECT TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (X, 'second'),
                'hh24:mi:ss'
               ) hr
  FROM DUAL;

En el uso de SqlServer:

SELECT CONVERT(varchar, DATEADD(s, X, 0), 108);

Respondido el 18 de junio de 15 a las 20:06

¿Qué pasa si quiero agregar 'días'? - ganado

Si tiene una variable que contiene fe 1 minuto (en segundos), puede agregarla a la marca de tiempo del sistema y luego usar to_char para seleccionar las diferentes partes de tiempo.

select to_char(systimestamp+60/(24*60*60), 'yyyy.mm.dd HH24:mi:ss') from dual

Respondido el 12 de junio de 12 a las 21:06

Intenté esto. Esto no funciona bien. porque, pensemos en segundos que son más de 86400 segundos (más de 24 horas, un día). Ejemplo: 86410 segundos, es decir, 1 día 10 segundos, lo que equivale a: 24:00:10 en formato hh:mm:ss. ... - user1430989

Probé algo como esto... SELECCIONA TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (82400, 'segundo'), 'hh24:mi:ss' ) hr FROM DUAL; - user1430989

Mi solución, de hecho, funciona. Obtiene 00:00:10 porque usa "TRUNC (SYSDATE)". Reemplace "TRUNC (SYSDATE)" con "systimestamp" y vuelva a intentarlo. - Bjarni Savarsson

Por cierto, sysdate tiene una precisión de segundos, systimestamp tiene una precisión de milisegundos. - Bjarni Savarsson

Para el comentario sobre la respuesta de vogash, entiendo que quieres algo como un contador de tiempo, eso es porque puedes tener más de 24 horas. Para ello puedes hacer lo siguiente:

select to_char(trunc(xxx/3600)) || to_char(to_date(mod(xxx, 86400),'sssss'),':mi:ss') as time
from dual;

xxx son su número de segundos.

La primera parte acumula las horas y la segunda parte calcula los minutos y segundos restantes. Por ejemplo, tener 150023 seconds te dará 41:40:23.

Pero si siempre quieres tener hh24:mi:ss aunque tengas más de 86000 seconds (1 día) puedes hacer:

select to_char(to_date(mod(xxx, 86400),'sssss'),'hh24:mi:ss') as time 
from dual;

xxx son su número de segundos.

Por ejemplo, tener 86402 seconds restablecerá el tiempo para 00:00:02.

Respondido 10 Feb 15, 11:02

Desafortunadamente no... Sin embargo, hay un truco simple si van a ser menos de 24 horas.

Oracle asume que un número agregado a una fecha está en días. Convierte el número de segundos en días. Agregue el día actual, luego use el to_date para tomar solo las partes que le interesan. Suponiendo que tiene x segundos:

select to_char(sysdate + (x / ( 60 * 60 * 24 ) ), 'HH24:MI:SS')
  from dual

Esto no funcionará si hay más de 24 horas, aunque puede eliminar los datos actuales nuevamente y obtener la diferencia en días, horas, minutos y segundos.

Si quieres algo como: 51:10:05, es decir, 51 horas, 10 minutos y 5 segundos, entonces tendrá que usar trunc.

Una vez más, asumiendo que tienes x segundos...

  • el numero de horas es trunc(x / 60 / 60)
  • el numero de minutos es trunc((x - ( trunc(x / 60 / 60) * 60 * 60 )) / 60)
  • El número de segundos es por lo tanto el x - hours * 60 * 60 - minutes * 60

Dejándote con:

with hrs as (
  select x, trunc(x / 60 / 60) as h
    from dual
         )
 , mins as (
  select x, h, trunc((x - h * 60 * 60) / 60) as m
    from hrs
         )
select h, m, x - (h * 60 * 60) - (m * 60)
  from mins

He configurado un Violín SQL demostrar.

Respondido el 13 de junio de 12 a las 07:06

Agregar un segundo es mucho más fácil: sysdate + interval '1' second - un caballo sin nombre

@a_horse_with_no_name, es justo, en realidad es más largo y no resuelve el segundo punto, ¡pero tiene un aspecto más limpio! - paquet

Quizás quisiste decir trunc(sysdate) + (x / (60 * 60 * 24)) en el primer fragmento de arriba? - Bob Jarvis - Reincorporar a Monica

Gracias @bob, ¡lo hice de hecho! - paquet

El siguiente es Yet Another Way (tm): todavía implica un pequeño cálculo, pero proporciona un ejemplo del uso de EXTRACTO para extraer los campos individuales de un INTERVALO:

DECLARE 
  SUBTYPE BIG_INTERVAL IS INTERVAL DAY(9) TO SECOND;

  i        BIG_INTERVAL;
  nSeconds NUMBER := 86400000;

  FUNCTION INTERVAL_TO_HMS_STRING(inv IN BIG_INTERVAL)
    RETURN VARCHAR2
  IS
    nHours    NUMBER;
    nMinutes  NUMBER;
    nSeconds  NUMBER;
    strHour_format  VARCHAR2(10) := '09';
    workInv   INTERVAL DAY(9) TO SECOND(9);
  BEGIN
    nHours := EXTRACT(HOUR FROM inv) + (EXTRACT(DAY FROM inv) * 24);
    strHour_format := TRIM(RPAD(' ', LENGTH(TRIM(TO_CHAR(ABS(nHours)))), '0') || '9');

    nMinutes := ABS(EXTRACT(MINUTE FROM inv));
    nSeconds := ABS(EXTRACT(SECOND FROM inv));

    RETURN TRIM(TO_CHAR(nHours, strHour_format)) || ':' ||
           TRIM(TO_CHAR(nMInutes, '09')) || ':' ||
           TRIM(TO_CHAR(nSeconds, '09'));
  END INTERVAL_TO_HMS_STRING;

BEGIN
  i := NUMTODSINTERVAL(nSeconds, 'SECOND');

  DBMS_OUTPUT.PUT_LINE('i (fields) = ' || INTERVAL_TO_HMS_STRING(i));
END;

El código que extrae los campos, etc., todavía tiene que contener un cálculo para convertir el campo DÍA en horas equivalentes, y no es el más bonito, pero envuelto perfectamente en un procedimiento que no es tan malo de usar.

Comparte y Disfruta.

Respondido el 13 de junio de 12 a las 14:06

Suponiendo que su tiempo se llame st.etime a continuación y se almacene en segundos, esto es lo que uso. Esto maneja los tiempos en los que los segundos son mayores que 86399 segundos (que son las 11:59:59 p. m.)

caso cuando st.etime > 86399 luego to_char(to_date(st.etime - 86400,'sssss'),'HH24:MI:SS') else to_char(to_date(st.etime,'sssss'),'HH24:MI: SS') fin readable_time

Respondido el 18 de Septiembre de 14 a las 17:09

Mi version. Mostrar el tiempo de actividad de Oracle DB en formato DDd HHh MMm SSs

select to_char(trunc((((86400*x)/60)/60)/24)) || 'd ' ||
   to_char(trunc(((86400*x)/60)/60)-24*(trunc((((86400*x)/60)/60)/24)), 'FM00') || 'h ' ||
   to_char(trunc((86400*x)/60)-60*(trunc(((86400*x)/60)/60)), 'FM00') || 'm ' ||
   to_char(trunc(86400*x)-60*(trunc((86400*x)/60)), 'FM00') || 's' "UPTIME"
 from (select (sysdate - t.startup_time) x from V$INSTANCE t);

idea de Aritmética de fecha/hora con Oracle 9/10

Respondido el 25 de junio de 15 a las 14:06

Convertir minutos a formato hora:min:seg

SELECT 
   TO_CHAR(TRUNC((MINUTES * 60) / 3600), 'FM9900') || ':' ||
   TO_CHAR(TRUNC(MOD((MINUTES * 60), 3600) / 60), 'FM00') || ':' ||
   TO_CHAR(MOD((MINUTES * 60), 60), 'FM00') AS MIN_TO_HOUR FROM DUAL

Respondido 29 Feb 16, 12:02

Para más de 24 horas puede incluir días con la siguiente consulta. El formato devuelto es days:hh24:mi:ss

consulta:
select trunc(trunc(sysdate) + numtodsinterval(9999999, 'second')) - trunc(sysdate) || ':' || to_char(trunc(sysdate) + numtodsinterval(9999999, 'second'), 'hh24:mi:ss') from dual;

Salida:
115:17:46:39

Respondido el 16 de diciembre de 16 a las 16:12

create or replace procedure mili(num in number)
as
yr number;
yrsms number;
mon number;
monsms number;
wk number;
wksms number;
dy number;
dysms number;
hr number;
hrsms number;
mn number;
mnsms number;
sec number;
begin 
yr := FLOOR(num/31556952000);
yrsms := mod(num, 31556952000);
mon := FLOOR(yrsms/2629746000);
monsms := mod(num,2629746000);
wk := FLOOR(monsms/(604800000));
wksms := mod(num,604800000); 
dy := floor(wksms/ (24*60*60*1000));
dysms :=mod(num,24*60*60*1000);
hr := floor((dysms)/(60*60*1000));
hrsms := mod(num,60*60*1000);
mn := floor((hrsms)/(60*1000));
mnsms := mod(num,60*1000);
sec := floor((mnsms)/(1000));
dbms_output.put_line(' Year:'||yr||' Month:'||mon||' Week:'||wk||' Day:'||dy||' Hour:'||hr||' Min:'||mn||' Sec: '||sec);
end;
/


begin 
mili(12345678904234);
end;

Respondido 04 ago 17, 10:08

create or replace function `seconds_hh_mi_ss` (seconds in number)     
return varchar2
is
hours_var number;    
minutes_var number;    
seconds_var number;    
remeinder_var number;    
output_var varchar2(32);    
begin    
select seconds - mod(seconds,3600) into hours_var from dual;    
select seconds - hours_var into remeinder_var from dual;    
select (remeinder_var - mod(remeinder_var,60)) into minutes_var from dual;    
select seconds - (hours_var+minutes_var) into seconds_var from dual;    
output_var := hours_var/3600||':'||minutes_var/60||':'||seconds_var;    
return(output_var);    
end;
/

Respondido el 09 de junio de 14 a las 06:06

Deberías echar un vistazo este sitio. ¡La sección TO_TIMESTAMP podría serte útil!

Sintaxis:

TO_TIMESTAMP ( string , [ format_mask ] [ 'nlsparam' ] )

Respondido el 12 de junio de 12 a las 21:06

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.