【问题标题】:Convert number to time将数字转换为时间
【发布时间】:2010-10-20 14:00:03
【问题描述】:

如何将数字 1.33408564814814 转换为时间 32:01:05?

【问题讨论】:

  • 也许支持者之一可以解释float 和... 32:01:05 之间的关系? SS:MM:HH??
  • 我的理解是:1.33408564814814 是以天为单位的持续时间,OP 希望将其转换为小时:分钟:秒
  • 浮点值是从另一个日期减去一个日期得到的值,例如从昨天午夜开始的今天早上 08:01:05。它正在转换为 HH:MI:SS,但 HH 部分不限于 24(或 12)小时。实际上是 1 天 8 小时 1 分 5 秒,但 OP 选择将天数显示为 24 小时的倍数,即 32 (1*24 + 8)。 (因此@vc 的答案中被注释掉的行,抑制了更正常的一天显示)。

标签: sql oracle


【解决方案1】:

如果你真的希望结果是一个字符串,你可以使用这样的函数:

set serveroutput on format wrapped;

declare
function days_to_time (p_days number) return varchar2
is
  d number := p_days;
  h integer;
  m integer;
  s integer;
begin
  h := trunc(d*24);
  d := d - h/24;
  m := trunc(d*24*60);
  d := d - m/24/60;
  s := round(d*24*60*60);
  return(h||':'||to_char(m,'FM00')||':'||TO_CHAR(s,'FM00'));
end;
begin
  dbms_output.put_line(days_to_time(1.33408564814814));
end;
/

anonymous block completed
32:01:05

【讨论】:

    【解决方案2】:
    SELECT
    -- EXTRACT(day FROM numtodsinterval(1.33408564814814 , 'DAY')) Days,
    EXTRACT(day FROM numtodsinterval(1.33408564814814 , 'DAY')) * 24 + EXTRACT(hour FROM numtodsinterval(1.33408564814814 , 'DAY')) TotalHours,
    -- EXTRACT(hour FROM numtodsinterval(1.33408564814814 , 'DAY')) Hours,
    EXTRACT(minute FROM numtodsinterval(1.33408564814814 , 'DAY')) Minutes,
    EXTRACT(second FROM numtodsinterval(1.33408564814814 , 'DAY')) Seconds
    FROM dual;
    

    【讨论】:

      【解决方案3】:

      原始数字是表示为天数的间隔。以下内容有点难看,但可能有助于说明发生了什么:

      SELECT days,
             hours,
             minutes,
             seconds,
             TO_CHAR(days, 'FM9') || ' ' ||
               TO_CHAR(day_hours, 'FM09') || ':' ||
               TO_CHAR(minutes, 'FM09') || ':' ||
               TO_CHAR(seconds, 'FM09') AS interval_string,
             TO_DSINTERVAL(TO_CHAR(days, 'FM9') || ' ' ||
                             TO_CHAR(day_hours, 'FM09') || ':' ||
                             TO_CHAR(minutes, 'FM09') || ':' ||
                             TO_CHAR(seconds, 'FM09')) actual_interval
       FROM (SELECT float_val,
                    days, hours, minutes,
                    hours - (days * 24) AS day_hours,
                    ROUND((((decimal_hours - hours) * 60) - trunc((decimal_hours - hours) * 60)) * 60) AS seconds
            FROM (SELECT float_val,
                         trunc(hours / 24) AS days,
                         decimal_hours,
                         hours,
                         (decimal_hours - hours) * 60 AS decimal_minutes,
                         trunc((decimal_hours - hours) * 60) AS minutes
                    FROM (SELECT float_val,
                                 float_val * 24 AS decimal_hours,
                                 TRUNC(float_val* 24) AS hours
                            FROM (SELECT 1.33408564814814 AS float_val FROM dual))));
      

      分享和享受。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-10
        • 2020-02-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多