Oracle конвертирует секунды в часы: минуты: секунды

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

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

Ответ 1

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

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

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

Ответ 2

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

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

Ответ 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);

Ответ 4

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

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

Ответ 5

К сожалению, нет... Однако есть простой трюк, если он будет меньше 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, чтобы продемонстрировать.

Ответ 6

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

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 в эквивалентные часы и не самый красивый, но аккуратно завернутый в процедуру, которую не так уж плохо использовать.

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

Ответ 7

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

случай, когда 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

Ответ 8

Для комментария к ответу 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, будет reset время 00:00:02.

Ответ 9

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

идея Арифметика даты и времени с Oracle 9/10

Ответ 10

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

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

Ответ 11

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

Query:
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

Ответ 12

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;

Ответ 13

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

Ответ 14

Вы должны проверить этот сайт. Раздел TO_TIMESTAMP может быть вам полезен!

Синтаксис:

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