2012-06-12 32 views

Antwort

20

Wenn Sie nur eine bestimmte Anzahl von Sekunden in HH zu konvertieren suchen: MI: SS-Format, das sollte es tun

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

wo x die Anzahl der Sekunden.

+0

Das funktioniert gut. Aber wenn die Stunden> 99 Stunden dann funktioniert es nicht richtig – user1430989

+0

Siehe meine Bearbeitung mit TO_CHAR anstelle von LPAD. Es sollte jetzt bis zu 9999 Stunden dauern. Wenn Sie mehr als das benötigen, können Sie der Formatzeichenfolge in der ersten TO_CHAR-Funktion zusätzliche 9 hinzufügen. – Mike

+0

Dies wird für den folgenden Fall nicht korrekt angezeigt: SELECT TO_CHAR (TRUNC (76014000/3600), 'FM999999900') || "Stunden" || TO_CHAR (TRUNC (MOD (76014000,3600)/60), 'FM00') || 'Min' VON DUAL; –

-2

Sie sollten this site überprüfen. Der Abschnitt TO_TIMESTAMP könnte für Sie nützlich sein!

Syntax:

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

1

Wenn Sie eine Variable enthält, F. E. haben 1 Minute (in Sekunden), können Sie es zum systimestempel hinzufügen und dann to_char verwenden, um die verschiedenen Zeitteile auszuwählen.

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

Ich versuchte dies.Das funktioniert nicht gut. Denken wir an Sekunden, die mehr als 86400 Sekunden (mehr als 24 Stunden pro Tag) sind. Beispiel: 86410 Sekunden, dh 1 Tag 10 Sekunden, was entspricht: 24:00:10 in hh: mm: ss Format .. Aber wie oben gesagt gibt es nur: 00:00:10 Wert, der ist falsch ... – user1430989

+0

Ich habe so etwas versucht .. SELECT TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (82400, 'zweite'), 'hh24: mi: ss' ) hr VON DUAL; – user1430989

+0

Meine Lösung funktioniert tatsächlich. Sie erhalten 00:00:10, weil Sie "TRUNC (SYSDATE)" verwenden. Ersetzen Sie "TRUNC (SYSDATE)" durch "systimestempel" und versuchen Sie es erneut. –

1

Leider nicht ... Es gibt jedoch einen einfachen Trick, wenn es weniger als 24 Stunden sein wird.

Oracle geht davon aus, dass eine zu einem Datum hinzugefügte Zahl in Tagen angegeben ist. Konvertiere die Anzahl der Sekunden in Tage. Fügen Sie den aktuellen Tag, dann verwenden Sie die to_date Funktion nur die Teile Ihrer interessiert sich nehmen Angenommen, Sie haben x Sekunden.

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

Das wird nicht funktionieren, wenn es mehr als 24 Stunden ist, wenn Sie die aktuelle entfernen Daten erneut und erhalten Sie den Unterschied in Tagen, Stunden, Minuten und Sekunden.

Wenn Sie etwas wollen: 51:10:05, d. H. 51 Stunden, 10 Minuten und 5 Sekunden, dann müssen Sie trunc verwenden.

Wieder einmal davon aus, dass Sie x Sekunden haben ...

  • Die Anzahl der Stunden ist trunc(x/60/60)
  • Die Anzahl der Minuten ist trunc((x - (trunc(x/60/60) * 60 * 60))/60)
  • Die Anzahl der Sekunden ist daher die x - hours * 60 * 60 - minutes * 60

Lassen Sie sich mit:

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 

Ich habe eine SQL Fiddle eingerichtet, um zu demonstrieren.

+0

Hinzufügen einer Sekunde ist viel einfacher: 'sysdate + interval '1' Sekunde' –

+0

@a_horse_with_no_name, fair genug, es ist tatsächlich länger und löst nicht den zweiten Punkt, aber ist sauberer suchen! – Ben

+0

Vielleicht hast du 'trunc (sysdate) + (x/(60 * 60 * 24))' im ersten obigen Ausschnitt gemeint? –

1

Das folgende ist ein weiterer Weg (tm) - noch ein wenig Berechnung beinhaltet aber ein Beispiel von EXTRACT mit den einzelnen Feldern aus einem INTERVAL ziehen:

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; 

Der Code, der die Felder extrahiert, usw., muss immer noch eine Berechnung enthalten, um das DAY-Feld in äquivalente Stunden zu konvertieren, und ist nicht das Schönste, aber ordentlich in eine Prozedur eingewickelt, ist es nicht zu schlecht zu benutzen.

Teilen und genießen.

25

Versuchen Sie diese. Sehr einfach und einfach Ihre Zeit unten und gespeichert wird st.etime in Sekunden genannt verwenden

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

Ich mag das besser als meine Antwort, aber es funktioniert nicht für mehr als 86399 Sekunden (1 Tag). – 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

Angenommen, hier ist das, was ich benutze. Dies behandelt Zeiten, in denen die Sekunden größer als 86399 Sekunden sind (was 11:59:59 pm ist)

Fall wenn st.time> 86399 dann to_char (to_date (st.time - 86400, 'sssss'), 'HH24 : MI: SS ') else to_char (to_date (st.time,' sssss '),' HH24: MI: SS ') ende lesbare_zeit

0

Für den Kommentar auf die Antwort von vogash, verstehe ich, dass Sie etwas wollen ein Zeitzähler, das ist, weil Sie mehr als 24 Stunden haben können. Hierfür können Sie folgendes tun:

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

xxx sind die Anzahl der Sekunden.

Der erste Teil akkumuliert die Stunden und der zweite Teil berechnet die verbleibenden Minuten und Sekunden. Wenn Sie beispielsweise 150023 seconds haben, erhalten Sie 41:40:23.

Aber wenn Sie immer hh24 wollen haben: mi: ss, auch wenn Sie mehr als 86000 seconds (1 Tag) haben Sie tun können:

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

xxx sind die Anzahl der Sekunden.

Zum Beispiel mit 86402 seconds es wird die Zeit auf 00:00:02 zurückgesetzt.

3

Der folgende Code ist weniger komplex und liefert das gleiche Ergebnis. Beachten Sie, dass "X" die Anzahl der Sekunden ist, die in Stunden konvertiert werden.

In Oracle Verwendung:

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

In SqlServer Verwendung:

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

Beachten Sie, dass dies nur für weniger als 24 Stunden funktioniert – Jared

0

Meine Version. Zeigen Oracle DB uptime im Format DDd HHh MMm WPs

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); 

Idee von Date/Time Arithmetic with Oracle 9/10

0

konvertieren Minuten zu Stunden: min: sec Format

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

Für mehr als 24 Stunden können Sie umfassen Tage mit die folgende Abfrage. Das zurückgegebene Format ist days:hh24:mi:ss

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

Ausgang:
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; 
Verwandte Themen