加倍当前时间

时间:2013-01-24 10:39:19

标签: sql oracle date-arithmetic

我有一个查询,我正在计算时间。我想把时间加倍,以便如果时间是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

我应该怎么做?

2 个答案:

答案 0 :(得分: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 )
/

这会在分钟中返回两倍的差异。同样,将输出呈现为显示格式留给读者。

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

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