我有一个查询,我正在计算时间。我想让时间加倍,这样如果时间到了,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
我该怎么办?
我有一个查询,我正在计算时间。我想让时间加倍,这样如果时间到了,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
我该怎么办?
如果您真的只使用时间元素,最简单的方法是使用“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 )
/
这将返回以分钟为单位的加倍差异。同样,将输出呈现为显示格式留给读者。
在我看来,您正在使用此处描述的方法(日期之间的减法): 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
这将为您提供结果的小时部分和分钟部分,您可能也希望有天部分。