将小数转换为日期
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')
我得到像 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')