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.
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.
Probieren Sie es aus ... Sehr einfach und leicht zu bedienen
select to_char(to_date(10000,'sssss'),'hh24:mi:ss') from dual;
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);
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 ...
trunc(x / 60 / 60)
trunc((x - ( trunc(x / 60 / 60) * 60 * 60 )) / 60)
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.
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.
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
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
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);
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
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;
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.