2012-06-12 3 views
11

У меня есть требование отображать доступное пользователю время в часах: минуты: формат секунд от заданного общего количества секунд. Цените, если вы знаете, что функция ORACLE делает то же самое. Я использую Oracle.Oracle конвертировать секунды в часы: минуты: секунды

Спасибо за ваше время.

ответ

20

Если вы просто хотите, чтобы преобразовать заданное число секунд в HH: MI: СС, это должно сделать

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

где x это количество секунд.

+0

Это работает хорошо. Но если часы> 99 часов, то он не работает правильно – user1430989

+0

Смотрите мое редактирование, используя TO_CHAR вместо LPAD. Он должен обработать до 9999 часов. Если вам нужно больше, вы можете добавить дополнительные 9 в строку формата в первой функции TO_CHAR. – Mike

+0

Это не подходит для нижнего регистра: SELECT TO_CHAR (TRUNC (76014000/3600), 'FM999999900') || 'Hrs' || TO_CHAR (TRUNC (MOD (76014000,3600)/60), 'FM00') || 'Min' FROM DUAL; –

-2

Вы должны зарегистрироваться this site. Раздел TO_TIMESTAMP может быть вам полезен!

Синтаксис:

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

1

Если у вас есть переменная, содержащая F.E. 1 минута (в секундах), вы можете добавить его в systimestamp, а затем использовать to_char, чтобы выбрать из него различные временные части.

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

Я попробовал это.Это не работает. потому что, давайте подумаем о секундах, которые составляют более 86400 секунд (более 24 часов, в день). Пример: 86410 секунд, т.е. 1 день 10 секунд, что равно: 24:00:10 в чч: мм: формат ss .. Но, как указано выше, это просто дает вам: 00:00:10 значение, которое неверно ... – user1430989

+0

Я пробовал что-то вроде этого. SELECT TO_CHAR (TRSN) (+ +) NUMTODSINTERVAL (82400, 'second'), 'hh24: mi: ss' ) hr FROM DUAL; – user1430989

+0

Мое решение действительно работает. Вы получаете 00:00:10, потому что используете «TRUNC (SYSDATE)». Замените «TRUNC (SYSDATE)» на «systimestamp» и повторите попытку. –

1

К сожалению, нет ... Однако есть простой трюк, если он будет менее 24 часов.

Oracle предполагает, что число, добавленное к дате, находится в днях. Преобразование количества секунд в дни. Добавить текущий день, а затем использовать функцию to_date принимать только те части вашей заинтересованы в Если у вас есть x секунд:.

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

Это не будет работать, если есть более чем за 24 часа, хотя вы можете удалить ток данные снова и получите разницу в днях, часах, минутах и ​​секундах.

Если вы хотите что-то наподобие: 51:10:05, то есть 51 час, 10 минут и 5 секунд, тогда вам нужно будет использовать trunc.

Еще раз при условии, что у вас есть x секунд ...

  • Количество часов trunc(x/60/60)
  • Количество минут trunc((x - (trunc(x/60/60) * 60 * 60))/60)
  • количество секунд поэтому x - hours * 60 * 60 - minutes * 60

Оставляем вас с:

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 

Я установил SQL Fiddle для демонстрации.

+0

Добавление одной секунды намного проще: 'sysdate + interval '1' second' –

+0

@a_horse_with_no_name, справедливо, это на самом деле дольше и не решает второй момент, но выглядит более чистым! – Ben

+0

Возможно, вы имели в виду «trunc (sysdate) + (x/(60 * 60 * 24))' в первом фрагменте выше? –

1

Ниже еще один способ (тм) - по-прежнему включает в себя небольшой расчет, но дает пример использования EXTRACT, чтобы вытащить отдельные поля из интервальных:

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; 

код, который извлекает поля, и т. д., все еще должен содержать расчет для преобразования поля DAY в эквивалентные часы и не самый красивый, но аккуратно завернутый в процедуру, которую не так уж плохо использовать.

Делитесь и наслаждайтесь.

25

Попробуйте этот. Очень простой и легкий в использовании

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

Мне нравится это лучше, чем мой ответ, но он не работает более 86399 секунд (1 день). – 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

Предполагая, что ваше время называется st.etime ниже и хранится в секундах, вот что я использую. Это обрабатывает время, когда секунды больше 86399 секунд (это 23:59:59 pm)

case when st.etime> 86399 then 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

Для комментария к ответу vogash, я понимаю, что вы хотите что-то вроде счетчик времени, потому что у вас может быть более 24 часов. Для этого вы можете сделать следующее:

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

xxx ваше количество секунд.

Первая часть накапливает часы, а вторая часть вычисляет оставшиеся минуты и секунды. Например, имея 150023 seconds, он даст вам 41:40:23.

Но если вы хотите всегда иметь HH24: MI: SS, даже если у вас есть больше, чем 86000 seconds (1 день), вы можете сделать:

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

xxx ваше количество секунд.

Например, имея 86402 seconds, он сбрасывает время до 00:00:02.

3

Следующий код является менее сложным и дает тот же результат. Обратите внимание, что «X» - это количество секунд, которое нужно преобразовать в часы.

При использовании Oracle:

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

При использовании SqlServer:

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

Обратите внимание, что это работает только в течение менее 24 часов – Jared

0

Моя версия. Показать Oracle DB безотказной работы в формате ДДД 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); 

идея из Date/Time Arithmetic with Oracle 9/10

0

Преобразовать минут час: мин: формат сек

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

Для более 24 часов, вы можете включать в себя дни с следующий запрос. Возвращаемый формат days:hh24:mi:ss

Запрос:
select trunc(trunc(sysdate) + numtodsinterval(9999999, 'second')) - trunc(sysdate) || ':' || to_char(trunc(sysdate) + numtodsinterval(9999999, 'second'), 'hh24:mi:ss') from dual;

Выход:
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; 
Смежные вопросы