分钟为HH.MM格式

时间:2012-08-11 20:19:51

标签: oracle time

我使用以下查询

(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。这该怎么做?

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

3 个答案:

答案 0 :(得分: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...)minute from (sysdate...)可能会返回0。但是,对于day,它会起作用。

答案 1 :(得分: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')

答案 2 :(得分: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等的计算中使用它。文档here

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

分享并享受。


编辑:更正了EXTRACT电话。添加了将SYSDATE - LOADING_TIME的结果转换为间隔。包含标志处理。