将小数转换为日期

Convert Decimal to Date

我得到像 15.73 这样的十进制输出,我希望将其转换为时间格式。 15.73 基本上类似于 15:43。我怎样才能达到这个结果?以下是我的查询:

SELECT ((TRUNC(lt.date_start + 1) - 1/(24*60*60)) - lt.date_start)*24 DUR, lt.date_start 
from losttime lt
where lt.date_start >= to_date('02/07/2020 08:00' , 'dd/mm/yyyy HH24:MI')

当前输出以小数形式出现,如附件所示。

如果您创建一个函数,它会使最终查询更简单。函数接受天数作为参数,returns它格式化

SQL> create or replace
  2     function f_days2ddhhmiss (par_broj_dana  in number)
  3        return varchar2
  4     is
  5        l_broj_dana  number := par_broj_dana;
  6        retval       varchar2 (20);
  7     begin
  8        with podaci
  9             as (select trunc (l_broj_dana) broj_dana,
 10                        round (mod (l_broj_dana * 24, 24), 2) broj_sati,
 11                        round (mod (l_broj_dana * 24 * 60, 60), 2) broj_minuta,
 12                        round (mod (l_broj_dana * 24 * 60 * 60, 60), 2)
 13                           broj_sekundi
 14                   from dual)
 15        select    lpad (trunc (p.broj_sati), 2, '0')
 16               || ':'
 17               || lpad (trunc (p.broj_minuta), 2, '0')
 18          into retval
 19          from podaci p;
 20
 21        return retval;
 22     end f_days2ddhhmiss;
 23  /

Function created.

SQL>

现在,您的查询(请参阅代码中的注释)。

SQL> with
  2  -- sample data; you already have that
  3  losttime (date_start) as
  4    (select to_date('07/02/2020 08:16', 'mm/dd/yyyy hh24:Mi') from dual union all
  5     select to_date('07/13/2020 08:24', 'mm/dd/yyyy hh24:mi') from dual),
  6  -- this is your current query; I just removed *24 as function expects number of DAYS, not HOURS
  7  yourquery as
  8    (select ((trunc(lt.date_start + 1) - 1/(24*60*60)) - lt.date_start) dur, lt.date_start
  9     from losttime lt
 10    )
 11  select dur, date_start, f_days2ddhhmiss(dur) result
 12  from yourquery;

       DUR DATE_START RESULT
---------- ---------- ----------
,655543981 02.07.2020 15:43
,649988426 13.07.2020 15:35

SQL>

由于函数 计算 天数和秒数,如果需要,您可以将它们包含在输出中。我不想将它们从函数中删除。或者,您甚至可以将该代码 移出 函数并将其放入查询自身,但它会变得有些混乱(并且可能更快)。

当我想计算 HH:MI 格式的 ELAPSED_TIME 时,我使用此查询

SQL> select * from my_test ;

C1                  C2
------------------- -------------------
2020-07-26 01:03:51 2020-07-26 19:03:51
2020-07-26 10:08:45 2020-07-26 14:38:45
2020-07-26 11:39:10 2020-07-26 13:54:10


SQL> select c1,c2,
TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(c2-c1, 'DAY')), 'FM00')
   || ':' ||
 TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(c2-c1, 'DAY')), 'FM00')
  as elapsed_time  from my_test ;   2    3    4    5

C1                  C2                  ELAPSED
------------------- ------------------- -------
2020-07-26 01:03:51 2020-07-26 19:03:51 18:00
2020-07-26 10:08:45 2020-07-26 14:38:45 04:30
2020-07-26 11:39:10 2020-07-26 13:54:10 02:15

SQL>

如果你想要以秒为单位的经过时间

SQL> select c1,c2,
  2  TO_CHAR(EXTRACT(HOUR FROM NUMTODSINTERVAL(c2-c1, 'DAY')), 'FM00')
   || ':' ||
 TO_CHAR(EXTRACT(MINUTE FROM NUMTODSINTERVAL(c2-c1, 'DAY')), 'FM00')
  3    4    5     || ':' ||
  6   TO_CHAR(EXTRACT(SECOND FROM NUMTODSINTERVAL(c2-c1, 'DAY')), 'FM00') as elapsed_time
 from my_test ;  7

C1                  C2                  ELAPSED_TIM
------------------- ------------------- -----------
2020-07-26 01:03:51 2020-07-26 19:03:51 18:00:00
2020-07-26 10:08:45 2020-07-26 14:38:45 04:30:00
2020-07-26 11:39:10 2020-07-26 13:54:10 02:15:00

SQL>

请注意,只有结束时间和开始时间之间的差异小于 24 小时,此查询才会有效。

您当前的计算得到 小时 的整数和 的小数表示;但是,在使用 Oracle 日期时,添加到日期的数字表示 的整数和 一天中的时间 的小数表示。转换非常简单——将您的值除以 24,或者在本例中简单地消除乘以 24 的乘积。这样您就可以得到一个小数日值。现在,要将其格式化为 HH:MI 您需要将其转换为有效日期,这里最简单的操作(因为您实际上并不关心 year/month/day 值)就是添加您的计算值 TRUNC(SYSDATE)。这样做会将您的值转换为 Oracle DATE,然后您可以使用 TO_CHAR 将 HH:MI 作为格式化字符串获取:

SELECT TO_CHAR(TRUNC(SYSDATE) +
                 (TRUNC(lt.DATE_START + 1) - INTERVAL '1' SECOND - lt.DATE_START), 'HH24:MI') DUR,
       lt.DATE_START
  FROM LOSTTIME lt
  WHERE lt.DATE_START >= TO_DATE('02/07/2020 08:00' , 'DD/MM/YYYY HH24:MI')

db<>fiddle here