web-dev-qa-db-ja.com

Oracle秒から時間への変換:分:秒

指定された合計秒数の値から、ユーザーの利用可能な時間を時間:分:秒の形式で表示する必要があります。同じことを行うOracle関数を知っている場合は感謝します。 Oracleを使用しています。

お時間をいただきありがとうございます。

15
user1430989

指定された秒数を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は秒数です。

27
Mike

これを試してください。非常にシンプルで使いやすい

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

次のコードはそれほど複雑ではなく、同じ結果になります。 「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);
5
user1389591

残念ながら、そうではありません...ただし、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 を設定して実証しました。

1
Ben

以下の時間はst.etimeと呼ばれ、秒単位で保存されると仮定して、ここで使用します。これは、秒が86399秒(11:59:59 pm)よりも大きい時間を処理します。

st.etime> 86399の場合、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

1
Jonathan Wade

以下は、まだ別の方法(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フィールドを同等の時間に変換する計算が含まれている必要があり、最もきれいではありませんが、使用するのが悪くない手順できれいにまとめられています。

共有してお楽しみください。

1
Bob Jarvis

F.e.を含む変数がある場合1分(秒単位)、それをsystimestampに追加し、to_charを使用して異なる時間部分を選択できます。

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

ヴォーガッシュによる回答についてのコメントについては、24時間を超えることができるため、タイムカウンターのようなものが必要であることを理解しています。このために、次のことができます。

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

xxxは秒数です。

最初の部分は時間を累積し、2番目の部分は残りの分と秒を計算します。たとえば、150023 secondsを使用すると、41:40:23が得られます。

ただし、86000 seconds(1日)を超えてもhh24:mi:ssを常に必要とする場合は、次の操作を実行できます。

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

xxxは秒数です。

たとえば、86402 secondsがあると、時間は00:00:02にリセットされます。

1
Scott Baxter

分を時:分:秒の形式に変換する

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

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
Jared

私のバージョン。フォーマットDDd HHh MMm SSsでOracle DBの稼働時間を表示

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での日付/時間演算 からのアイデア

0
Vlad
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