wake-up-neo.com

Oracle konvertiert Sekunden in Stunden: Minuten: Sekunden

Ich habe die Anforderung, die verfügbare Zeit des Benutzers in Stunden: Minuten: Sekunden ausgehend von einer bestimmten Gesamtanzahl von Sekunden anzuzeigen. Schätzen Sie es, wenn Sie eine Oracle-Funktion kennen, um dasselbe zu tun. Ich benutze Oracle.

Vielen Dank für Ihre Zeit.

13
user1430989

Wenn Sie nur eine bestimmte Anzahl von Sekunden in das HH: MI: SS-Format konvertieren möchten, sollten Sie dies tun

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

dabei ist x die Anzahl der Sekunden.

24
Mike

Probieren Sie es aus ... Sehr einfach und leicht zu bedienen

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

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

Bei Oracle verwenden:

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

In SqlServer verwenden Sie:

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

Leider nicht ... Allerdings gibt es einen einfachen Trick, wenn es weniger als 24 Stunden dauern wird. 

Oracle geht davon aus, dass eine zu einem Datum hinzugefügte Zahl in Tagen ist. Wandeln Sie die Anzahl der Sekunden in Tage um. Fügen Sie den aktuellen Tag hinzu und verwenden Sie die to_date-Funktion, um nur die Teile zu übernehmen, an denen Sie interessiert sind. Wenn Sie x Sekunden haben

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

Dies funktioniert nicht, wenn mehr als 24 Stunden vergangen sind. Sie können jedoch die aktuellen Daten wieder entfernen und die Differenz in Tagen, Stunden, Minuten und Sekunden anzeigen.

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

Wieder einmal angenommen, 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 der x - hours * 60 * 60 - minutes * 60

Dich verlassen 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 ein SQL Fiddle zur Demonstration eingerichtet.

1
Ben

Das Folgende ist noch ein anderer Weg (tm) - beinhaltet immer noch eine kleine Berechnung, zeigt jedoch ein Beispiel für die Verwendung von EXTRACT, um die einzelnen Felder aus einem INTERVAL herauszuziehen:

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 usw. extrahiert, muss noch eine Berechnung enthalten, um das DAY-Feld in entsprechende Stunden umzuwandeln, und es ist nicht die schönste, aber ordentlich verpackt in einer Prozedur, die nicht zu schlecht ist.

Teile und genieße.

1
Bob Jarvis

Wenn Sie eine Variable mit f.e. haben 1 Minute (in Sekunden) können Sie es zum Systemstempel hinzufügen und dann mit to_char die verschiedenen Zeitbereiche auswählen.

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

Minuten in Stunden umrechnen: min: s-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

Für mehr als 24 Stunden können Sie Tage mit der folgenden Abfrage angeben. 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;

Ausgabe:
115:17:46:39

0
Jared

Meine Version. Zeigen Sie die Verfügbarkeit der Oracle DB im Format DDd HHh MMm SSs an

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 Datum/Uhrzeit-Arithmetik mit Oracle 9/10

0
Vlad

Angenommen, Ihre Zeit wird als st.etime bezeichnet und in Sekunden gespeichert. Hier ist, was ich benutze. Dies behandelt Zeiten, in denen die Sekunden größer als 86399 Sekunden sind (dh um 11:59:59 Uhr).

fall, wenn st.etime> 86399, dann to_char (to_date (st.etime - 86400, 'sssss'), 'HH24: MI: SS') ansonsten to_char (to_date (st.etime, 'sssss')) 'HH24: MI: SS ') Ende readable_time 

0
Jonathan Wade
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;
0
mayank

Für den Kommentar zur Antwort von vogash verstehe ich, dass Sie so etwas wie einen Zeitzähler haben wollen, das ist, weil Sie mehr als 24 Stunden haben können. Dafü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 ist Ihre Anzahl von Sekunden.

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

Wenn Sie jedoch immer hh24: mi: ss haben möchten, auch wenn Sie mehr als 86000 seconds (1 Tag) haben, können Sie Folgendes tun:

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

xxx ist Ihre Anzahl von Sekunden.

Wenn Sie beispielsweise 86402 seconds haben, wird die Uhrzeit auf 00:00:02 zurückgesetzt.

0
Scott Baxter