我使用以下查询
(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分钟
答案 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 DATE
和REQUIRED_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的结果转换为间隔。包含标志处理。