2

我正在使用以下查询

(24 * extract(day from (sysdate - c.LOADING_TIME) day(9) to second))
       + extract(hour from (sysdate - c.LOADING_TIME) day(9) to second)
       + ((1/100) * extract(minute from (sysdate - c.LOADING_TIME) day(9) to second)) -
required_time/60

现在我得到的数据类似于 6.76。问题是我没有在 HH.MM 中转换 required_time。这个怎么做?

ps 请注意,required_time 表示分钟(整数)我需要输出为 5.45,这意味着 5 小时 45 分钟

4

3 回答 3

0

因此,您有LOADING_TIME DATEREQUIRED_TIME INTEGER,并且您正在尝试确定实际加载时间 (SYSDATE - LOADING_TIME) 和标准加载时间 (REQUIRED_TIME) 之间的差异。

如果我做对了,请尝试以下操作:

WITH e AS 
  (SELECT NUMTODSINTERVAL((SYSDATE - LOADING_TIME), 'DAY') -
          NUMTODSINTERVAL(REQUIRED_TIME, 'MINUTE') AS ELAPSED 
     FROM YOUR_TABLE_HERE) 
SELECT TRIM(CASE
              WHEN EXTRACT(HOUR FROM ELAPSED) < 0 THEN '-'
              WHEN EXTRACT(MINUTE FROM ELAPSED) < 0 THEN '-'
              ELSE ' '
            END ||
            TRIM(TO_CHAR(ABS(EXTRACT(HOUR FROM ELAPSED)), '09')) || '.' || 
            TRIM(TO_CHAR(ABS(EXTRACT(MINUTE FROM ELAPSED)), '09')))
  FROM e;

NUMTODSINTERVAL是 Oracle 的函数,用于将诸如 REQUIRED_TIME 之类的标量值转换为 INTERVAL,然后可以将其用于涉及 DATE 等的计算。文档在这里

希望这会让事情变得更简单一些。

分享和享受。


编辑:更正了 EXTRACT 调用。添加了 SYSDATE - LOADING_TIME 的结果到时间间隔的转换。包括标志处理。

于 2012-08-12T00:24:40.863 回答
0

要进行EXTRACT工作,您必须使用转换字段以TO_TIMESTAMP()显示正确的时间戳。另外,我认为您所说的MI不是MM因为MM意味着月份而不是分钟。像这样的东西-

SELECT EXTRACT(MINUTE FROM TO_TIMESTAMP('01-JAN-2005 19:15:26','DD-MON-YYYY HH24:MI:SS')) FROM dual;

使用日期字段,它将是-

SELECT EXTRACT(MINUTE FROM TO_TIMESTAMP(TO_CHAR(sysdate,'DD-MON-YYYY HH24:MI:SS'),'DD-MON-YYYY HH24:MI:SS')) FROM dual;

在您的查询中,hour from (sysdate...)andminute from (sysdate...)可能正在返回0. 但是,因为day它会起作用。

于 2012-08-11T22:22:35.970 回答
0

您想要以小时和分钟表示的差异。我会用简单的算术来做到这一点:

select trunc((sysdate - c.LoadingTime)*24) as hours,
       trunc(mod((sysdate - c.LoadingTime)*24*60, 60)) as minutes
from . . .

您可以将其格式化为字符串:

select to_char(trunc((sysdate - c.LoadingTime)*24), '00')||':'+
       to_char(trunc(mod((sysdate - c.LoadingTime)*24*60, 60)), '00')
于 2012-08-11T22:38:32.593 回答