2011-01-13 42 views
1

「20 -Nov-2010 20:11:22」という2つのタイムスタンプが開始され、終了しました。今私は12時である9時から21時の時間を計算したいと思います。私は9の間で時間と分を望ん'10 -NOV-2010' と'20 -NOV-2010' start date及び実施例から今end date2つの日付の間に9時から21時までの時間を取得する方法

componentid starttime    endtime    result 
3    13-Nov-2010 10:00:00 13-Nov-2010 21:00:00 11:00 hours 
5    14-Nov-2010 09:30:00 14-Nov-2010 22:00:00 11:30 and 
3    15-Nov-2010 08:20:00 15-Nov-2010 20:00:00 11:00 minutes 
4    16-Nov-2010 08:00:00 16-Nov-2010 23:00:00 12:00 
                  sum 45:30 

よう

入力、2つの日付になります。 00〜21:00(2010年11月10日と2010年11月20日)私はOracle SQLでそれを行う方法がわかりません - あなたはそれを行う方法を教えてくださいできますか?

+0

行単位の結果列の後か、最後のSUMだけですか? SUM形式はH:MMです(Hは数百、数千などあります)。 – RichardTheKiwi

答えて

0

どうやって手で行いますか?

  • エンドポイントを設定するには、その日の終了時刻とその日の21:00の最小値(より早い値)を決定する必要があります。
  • 開始時刻を設定するには、その日の開始時刻の最大(後)と、その日の09:00を決定する必要があります。
  • これらの2つの値の違いは、必要な時間です。

これを減らすには、Oracleの時間操作機能に関する知識が必要です。これは、各DBMSに固有の機能とルールのセットがあり、必ずしも機能するものではありません他の。

0

これを試してみてください:

SELECT componentid, 
    starttime, 
    endtime, 
    (
    CASE WHEN (endtime> TRUNC(endtime+ 21/24)) THEN TRUNC(endtime+ 21/24) ELSE endtime END - 
    CASE WHEN (starttime< TRUNC(endtime+ 9/24)) THEN TRUNC(starttime+ 9/24) ELSE starttime END 
    )*24 result  
    FROM <YOURTABLE> 
1

これは、時間演算を行うためのさらに別の方法を提供するの関心は、最終的な合計

select 
    trunc(Mi/60) || ':' || right('0' || mod(Mi,60), 2) Total 
from 
(
    select sum 
    (
     (
     case when endtime-trunc(endtime) > 21.0/24 then 21.0/24 else endtime-trunc(endtime) end 
     - 
     case when starttime-trunc(starttime) < 9.0/24 then 9.0/24 else starttime-trunc(starttime) end 
     ) * 24 * 60 
    ) Mi 
    from tbl 
    where starttime >= to_date('10-Nov-2010') 
     and endtime < to_date('20-Nov-2010') + 1 
) M 
0

のためですが、私は区間演算を使用してビューを使用します。 (PostgreSQLではなくOracleです)

CREATE VIEW experimental_time_diffs AS 
SELECT component_id, start_time, end_time, 
    case when cast(end_time as time) > '21:00' 
     then date_trunc('day', end_time) + interval '21' hour else end_time end - 
    case when cast(start_time as time) < '9:00' 
     then date_trunc('day', start_time) + interval '9' hour else start_time end 
    AS adj_elapsed_time 
    FROM your_table; 

そして、ビューの列 "adj_elapsed_time"で合計することができます。

select sum(adj_elapsed_time) as total_elapsed_time 
from experimental_time_diffs; 
+0

あなたのケースでは、終了時間が21:59の場合はカウントされない59分の時間がカウントされます。 'EXTRACT(分から終わりまでの時間)> INTERVAL '21:00''; EXTRACTの結果から真夜中('00:00 ')を減算して区間に変換する必要があるかもしれないし、 '...> TIME '21:00''を使う必要があるかもしれません。あるいは '> 20'を使うだけです。終了時間が21:30に変更されると、処理が煩雑になります。 –

+0

あなたは正しいです。タイムスタンプを時間としてキャストする方が簡単なようです。 –

関連する問題