Oracle将秒转换为小时:分钟:秒

时间:2012-06-12 19:58:38

标签: sql oracle plsql plsqldeveloper

我需要以小时为单位显示用户可用时间:分钟:来自给定总秒数值的秒数格式。感谢您是否知道ORACLE功能也是如此。我正在使用Oracle。

感谢您的时间。

14 个答案:

答案 0 :(得分:30)

试试这个。 非常简单易用

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

答案 1 :(得分:25)

如果您只想将给定的秒数转换为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 :(得分:5)

以下代码不太复杂,并给出相同的结果。请注意' 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);

答案 3 :(得分:1)

如果你有一个包含f.e的变量。 1分钟(以秒为单位),您可以将其添加到systimestamp,然后使用to_char从中选择不同的时间部分。

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

答案 4 :(得分: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来演示。

答案 5 :(得分:1)

以下是另一种方式(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字段转换为等效小时,并且不是最漂亮的,但在程序中整齐地包裹起来使用起来并不算太糟糕。

分享并享受。

答案 6 :(得分:1)

假设您的时间被称为st.etime,并且存储在几秒钟内,这就是我使用的。这将处理秒数大于86399秒(即晚上11:59:59)的时间

st.etime&gt;的情况86399然后to_char(to_date(st.etime - 86400,'sssss'),'HH24:MI:SS')否则to_char(to_date(st.etime,'sssss'),'HH24:MI:SS')end readable_time < / p>

答案 7 :(得分:1)

关于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

答案 8 :(得分:0)

我的版本。以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);

来自Date / Time Arithmetic with Oracle 9/10

的想法

答案 9 :(得分: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

答案 10 :(得分: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

答案 11 :(得分: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;

答案 12 :(得分:-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;
/

答案 13 :(得分:-2)

你应该看看this site。 TO_TIMESTAMP部分可能对您有用!

语法:

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