-4

時間を計算するクエリがあります。時間を 2 倍にして、時間が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」日付マスクを使用することです。したがって、このクエリは、2 つの列の間の秒数の 2 倍を返します。

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 )
/

これは、2 倍の差分を分単位で返します。繰り返しますが、出力を表示形式にレンダリングすることは、読者に任されています。

于 2013-01-24T14:42:31.280 に答える
0

ここで説明されている方法を使用しているようです (日付間の減算): http://www.akadia.com/services/ora_date_time.html

期間の長さを 2 倍にしたい場合は、次のように基本時間差に 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 に答える