【问题标题】:Oracle Convert Seconds to Hours:Minutes:SecondsOracle 将秒转换为小时:分钟:秒
【发布时间】:2012-06-15 18:19:50
【问题描述】:

我需要从给定的总秒数值中以 Hours:Minutes:Seconds 格式显示用户可用时间。感谢您是否知道 ORACLE 函数可以执行相同操作。我正在使用 Oracle。

感谢您的宝贵时间。

【问题讨论】:

    标签: sql oracle plsql plsqldeveloper


    【解决方案1】:

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

    语法:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 我试过这个。这效果不好。因为,让我们考虑超过 86400 秒(超过 24 小时,一天)的秒数。示例:86410 秒,即 1 天 10 秒,等于:hh:mm:ss 格式的 24:00:10 .. 但是,根据上面它只给你: 00:00:10 值,这是错误的...
      • 我试过这样的事情.. SELECT TO_CHAR (TRUNC (SYSDATE) + NUMTODSINTERVAL (82400 , 'second'), 'hh24:mi:ss' ) hr FROM DUAL;
      • 我的解决方案确实有效。你得到 00:00:10 因为你使用“TRUNC(SYSDATE)”。将“TRUNC (SYSDATE)”替换为“systimestamp”,然后重试。
      • 顺便说一下,sysdate精确到秒,systimestamp精确到毫秒。
      【解决方案3】:

      很遗憾,没有……但是,如果要少于 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 来演示。

      【讨论】:

      • 增加一秒要容易得多:sysdate + interval '1' second
      • @a_horse_with_no_name,很公平,它实际上更长,并没有解决第二点,但看起来更干净!
      • 也许你的意思是上面第一个sn-p中的trunc(sysdate) + (x / (60 * 60 * 24))
      • 谢谢@bob,我确实做到了!
      【解决方案4】:

      如果您只是想将给定的秒数转换为 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 是秒数。

      【讨论】:

      • 这很好用。但如果小时数 > 99 小时,则它无法正常工作
      • 查看我使用 TO_CHAR 而不是 LPAD 进行的编辑。它现在最多可以处理 9999 小时。如果您需要更多,可以在第一个 TO_CHAR 函数的格式字符串中添加额外的 9。
      • 以下情况不正确:SELECT TO_CHAR(TRUNC(76014000/3600),'FM999999900') || '小时' || TO_CHAR(TRUNC(MOD(76014000,3600)/60),'FM00') || '最小'来自双重;
      • @Nisha - 运行您的查询给了我 21115Hrs 00Min... 对我来说似乎是正确的。
      • @Mike:预期的答案是 21.115 小时。但查询返回 21115 小时。刚刚意识到我正在使用毫秒。查询工作正常。我将不得不将毫秒转换为秒并替换它来代替 X 并且它可以工作......谢谢!
      【解决方案5】:

      以下是另一种方式 (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】:

        试试这个。 非常简单易用

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

        【讨论】:

        • 我比我的回答更喜欢这个,但它的工作时间不超过 86399 秒(1 天)。
        • 完美解决方案
        【解决方案7】:
        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;
        /
        

        【讨论】:

          【解决方案8】:

          假设您的时间在下面称为 st.etime 并以秒为单位存储,这就是我使用的。这会处理秒数大于 86399 秒(即晚上 11:59:59)的时间

          当 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') 结束 readable_time

          【讨论】:

            【解决方案9】:

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

            【讨论】:

              【解决方案10】:

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

              【讨论】:

              • 如果我想添加“天”怎么办?
              【解决方案11】:

              我的版本。以 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的想法

              【讨论】:

                【解决方案12】:

                将分钟转换为小时:分钟:秒格式

                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
                

                【讨论】:

                  【解决方案13】:

                  对于超过 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

                  【讨论】:

                    【解决方案14】:
                    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;
                    

                    【讨论】:

                      猜你喜欢
                      • 2021-10-29
                      • 1970-01-01
                      • 1970-01-01
                      • 2015-06-02
                      • 2011-09-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多