-4

我有一个查询,我正在计算时间。我想让时间加倍,这样如果时间到了,01:40它应该变成03:20. 这是我当前的查询

SELECT TO_CHAR(TRUNC((ATN_INN-ACT_INN)*24),'09')||':'||  
TO_CHAR(TRUNC(((ATN_INN-ACT_INN)*24-TRUNC((ATN_INN-ACT_INN)*24))*60),'09') B
FROM SML.EMP_INFO A

我该怎么办?

4

2 回答 2

1

如果您真的只使用时间元素,最简单的方法是使用“SSSSS”日期掩码,它返回午夜后的秒数。所以这个查询将返回两列之间秒数的两倍:

select ( to_number(to_char(atn_inn, 'sssss')) 
          - to_number(to_char(acn_inn, 'sssss')) ) * 2 as double_diff_in secs
from sml.emp_info
/ 

将秒转换为小时和分钟留给读者作为练习。

请注意,仅当 ATN_INN 晚于 ACT_INN 但仍在同一天时,此查询才有意义。这是@Ben 试图做出的澄清(没有成功)。如果不是这种情况,则需要不同的解决方案,例如 ....

select ( ( extract ( hour from diff ) * 60) 
            + extract ( minute from diff  ) ) *2  as double_diff_in mins
from ( select to_dsinterval ( atn_inn - act_inn ) as diff
        from sml.emp_info )
/

这将返回以分钟为单位的加倍差异。同样,将输出呈现为显示格式留给读者。

于 2013-01-24T14:42:31.280 回答
0

在我看来,您正在使用此处描述的方法(日期之间的减法): http ://www.akadia.com/services/ora_date_time.html

如果您想将周期的长度加倍,您实际上只需将基本时间差乘以 2,如下所示:

SELECT TO_CHAR(TRUNC((2*(ATN_INN-ACT_INN))*24),'09')
    || ':' ||  
    TO_CHAR(TRUNC(((2*(ATN_INN-ACT_INN))*24
        -TRUNC((2*(ATN_INN-ACT_INN))*24))*60),'09') B
FROM SML.EMP_INFO A

这将为您提供结果的小时部分和分钟部分,您可能也希望有天部分。

于 2013-01-24T11:17:31.333 回答