2012-06-12 15 views

Odpowiedz

20

Jeśli szukasz po prostu zamienić podaną liczbę sekund do HH: MI: SS, to powinno go

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

gdzie x to liczba sekund zrobić.

+0

To działa dobrze. Ale jeśli godziny> 99 godzin to nie działa poprawnie – user1430989

+0

Zobacz moją edycję za pomocą TO_CHAR zamiast LPAD. Powinien zająć do 9999 godzin. Jeśli potrzebujesz więcej, możesz dodać dodatkowe 9 do ciągu formatu w pierwszej funkcji TO_CHAR. – Mike

+0

To nie przychodzi poprawnie dla poniższego przypadku: SELECT TO_CHAR (TRUNC (76014000/3600), 'FM999999900') || "H" || TO_CHAR (TRUNC (MOD (76014000,3600)/60), "FM00") || "Min" Z PODWÓJNEGO; –

-2

Powinieneś sprawdzić this site. Sekcja TO_TIMESTAMP może być przydatna dla Ciebie!

Składnia:

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

1

Jeśli masz zmienną zawierającą F. E. 1 minutę (w sekundach), możesz dodać go do systimestampu, a następnie użyć to_char, aby wybrać z niego różne części czasu.

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

próbowałem tego.To nie działa dobrze. ponieważ, pomyślmy o sekundach, które są dłuższe niż 86400 sekund (więcej niż 24 godziny, dziennie). Przykład: 86410 sekund, czyli 1 dzień 10 sekund, co jest równe: 24:00:10 w gg: mm: ss format .. Ale, jak na powyższym, daje tylko: 00:00:10 wartość, co jest źle ... – user1430989

+0

Próbowałem czegoś takiego .. SELECT TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (82400, 'sekunda'), 'hh24: mi: ss' ) hr z DUAL; – user1430989

+0

Moje rozwiązanie faktycznie działa. Otrzymujesz 00:00:10, ponieważ używasz "TRUNC (SYSDATE)". Zamień "TRUNC (SYSDATE)" na "systimestamp" i spróbuj ponownie. –

1

Niestety nie ... Jednak istnieje prosty trik, jeśli będzie to mniej niż 24 godzin.

Oracle zakłada, że ​​liczba dodana do daty to dni. Konwertuj liczbę sekund na dni. Dodaj bieżący dzień, a następnie użyj funkcji to_date wziąć tylko części Twój zainteresowanych Zakładając masz x sekund.

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

to nie będzie działać, jeśli nie więcej niż 24 godzin, choć można usunąć prąd danych ponownie i uzyskaj różnicę w dniach, godzinach, minutach i sekundach.

Jeśli chcesz coś takiego: 51:10:05, tj. 51 godzin, 10 minut i 5 sekund, będziesz musiał użyć trunc.

Ponownie zakładając, że masz x sekund ...

  • Liczba godzinach trunc(x/60/60)
  • liczba minut jest trunc((x - (trunc(x/60/60) * 60 * 60))/60)
  • liczba sekund jest więc x - hours * 60 * 60 - minutes * 60

Zostawiono Ci:

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 

Przygotowałem zestaw SQL Fiddle do demonstracji.

+0

Dodanie jednej sekundy jest o wiele łatwiejsze: 'sysdate + interval '1' second' –

+0

@a_horse_with_no_name, niewystarczająco, jest dłuższe i nie rozwiązuje drugiego punktu, ale jest czystsze! – Ben

+0

Być może miałeś na myśli 'trunc (sysdate) + (x/(60 * 60 * 24))' w pierwszym fragmencie powyżej? –

1

Poniżej jest jeszcze inny sposób (tm) - nadal wymaga trochę obliczenia ale stanowi przykład z zastosowaniem ekstraktu wyciągnąć poszczególne pola z przerwą:

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; 

kod, który wyodrębnia pól, itp., wciąż musi zawierać obliczenia, aby przekonwertować pole DZIEŃ na równoważne godziny, i nie jest najładniejsze, ale opakowane starannie w procedurze, której nie jest tak źle używać.

Udostępnij i ciesz się.

25

Wypróbuj tę. Bardzo prosty i łatwy w użyciu

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

Podoba mi się to lepiej niż moja odpowiedź, ale nie działa więcej niż 86399 sekund (1 dzień). – 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

Zakładając, że czas jest nazywany st.etime poniżej i przechowywane w sekundach, o to co używam. Obsługuje czasy, w których sekundy są większe niż 86399 sekund (co jest 23:59:59 po południu)

przypadku, gdy st.etime> 86399 to to_char (to_data (st.etime - 86400, 'sssss'), 'HH24 : MI: SS ') else to_char (to_data (st.etime,' sssss '),' HH24: MI: SS ') koniec readable_time

0

Za komentarz na temat odpowiedzi udzielonej przez vogash, rozumiem, że chcesz coś takiego licznik czasu, to dlatego, że możesz mieć więcej niż 24 godziny. W tym celu możesz wykonać następujące czynności:

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

xxx to Twoja liczba sekund.

Pierwsza część gromadzi godziny, a druga część oblicza pozostałe minuty i sekundy. Na przykład mając numer 150023 seconds, otrzymasz numer 41:40:23.

Ale jeśli chcesz zawsze mieć hh24: MI: SS, nawet jeśli masz więcej niż 86000 seconds (1 dzień) można zrobić:

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

xxx są twoje liczba sekund.

Na przykład, mając 86402 seconds resetuje on czas do 00:00:02.

3

Poniższy kod jest mniej złożony i daje taki sam wynik. Zwróć uwagę, że "X" to liczba sekund do przeliczenia na godziny.

W użyciu Oracle:

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

W użyciu SQLSERVER:

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

Pamiętaj, że działa to tylko w przypadku mniej niż 24 godzin – Jared

0

Moja wersja. Pokaż Oracle DB przestojów w formacie 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); 

pomysł z Date/Time Arithmetic with Oracle 9/10

0

Konwersja minut na godzinę: min: formacie sek

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

Dla większej niż 24 godzin można obejmować dni z następujące zapytanie. Zwrócony format jest days:hh24:mi:ss

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

wyjściowa:
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; 
Powiązane problemy