2012-06-12 194 views
11

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

Gracias por su tiempo.

Respuesta

20

Si usted está buscando para convertir un número determinado de segundos en HH: MI: SS, esto debe hacerlo

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

donde x es el número de segundos.

+0

Esto funciona bien. Pero si las horas> 99 horas no funcionan correctamente – user1430989

+0

Ver 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

+0

Esto no viene correctamente para el caso siguiente: SELECCIONAR TO_CHAR (TRUNC (76014000/3600), 'FM999999900') || 'Hrs' || TO_CHAR (TRUNC (MOD (76014000,3600)/60), 'FM00') || 'Min' FROM DUAL; –

-2

Deberías echar un vistazo a this site. ¡La sección TO_TIMESTAMP podría ser útil para usted!

Sintaxis:

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

1

Si tiene una variable que contiene F. E. 1 minuto (en segundos), puede agregarlo a la marca de tiempo syst y luego usar to_char para seleccionar las diferentes partes de tiempo de la misma.

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

yo probamos este.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, que es igual a: 24:00:10 en formato hh: mm: ss .. Pero, como se indicó anteriormente, solo le da: 00:00:10 valor, que es incorrecto ... – user1430989

+0

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

+0

Mi solución, de hecho, funciona. Obtendrá 00:00:10 porque usa "TRUNC (SYSDATE)". Reemplace "TRUNC (SYSDATE)" con "systimestamp" y vuelva a intentarlo. –

1

Por desgracia no ... Sin embargo, hay un truco simple si va a ser menos de 24 horas.

Oracle asume que un número agregado a una fecha es en días. Convierta la cantidad de segundos en días. Añadir el día actual, a continuación, utilizar la función to_date tomar sólo las partes de su interesada en Asumiendo 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 se puede quitar la corriente datos de nuevo 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 vas a tener que usar trunc.

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

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

Saliendo 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 SQL Fiddle para demostrar.

+0

Agregar un segundo es mucho más fácil: 'sysdate + interval '1' second' –

+0

@a_horse_with_no_name, es más que suficiente, en realidad es más largo y no resuelve el segundo punto, ¡pero es más limpio! – Ben

+0

Quizás quiso decir 'trunc (sysdate) + (x/(60 * 60 * 24))' en el primer fragmento de arriba? –

1

La siguiente es otra manera (tm) - todavía implica un poco de cálculo, pero proporciona un ejemplo de uso de extracto para tirar de 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., aún tiene que contener un cálculo para convertir el campo DÍA a horas equivalentes, y no es el más bonito, pero está bien organizado en un procedimiento que no está mal usar.

Compartir y disfrutar.

25

Pruebe este. muy simple y fácil de usar

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

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

-1
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; 
/
0

Asumiendo que su tiempo se llama st.etime a continuación y se almacena en cuestión de segundos, esto es lo que yo uso. Esto maneja tiempos donde los segundos son mayores que 86399 segundos (que es 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 ') end readable_time

0

Para el comentario sobre la respuesta de vogash, entiendo que quieres algo como un contador de tiempo, eso es porque puede tener más de 24 horas. Para ello se puede 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 el 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 le dará 41:40:23.

Pero si siempre desea tener HH24: MI: SS, incluso si tiene más de 86000 seconds (1 día) que puede hacer:

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

xxx son el número de segundos.

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

3

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

En el uso de Oracle:

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

En uso SqlServer:

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

Tenga en cuenta que esto solo funciona si durante menos de 24 horas – Jared

0

Mi versión. Mostrar el tiempo de funcionamiento 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 Date/Time Arithmetic with Oracle 9/10

0

Conversor minutos a horas: minutos: formato 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 
0

durante más de 24 horas se pueden 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

0
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; 
Cuestiones relacionadas