2011-01-13 51 views
1

我有兩個時間戳,例如'20Nov-2010 20:11:22'開始和結束。現在我想計算9點到21點之間的時間,即12小時。如何獲得兩個日期之間的9:00到21:00的時間

的投入將是兩個日期像'10 -nov-2010' 和'20 -nov-2010' start dateend date

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 
從實例

現在我只希望在9之間的小時和分鐘:從2010年11月10日至2010年11月20日這段時間內,00至21:00。我不知道如何在Oracle SQL中做到這一點 - 你能解釋一下怎麼做嗎?

+0

你是在逐行結果列之後,還是隻是最後的SUM? SUM格式是H:MM,其中H可以是數百或數千,或者其他? – RichardTheKiwi

回答

0

你會怎麼做?

  • 您需要確定當天結束時間的最小值(早些時候)以及當天的21:00來確定結束點。
  • 您需要確定開始時間的最大值(稍後),以確定起始點當天和當天的09:00。
  • 這兩個值之間的差異是你想要的時間。

減少到SQL要求for 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

你說得對。看起來隨着時間推移時間戳更容易。 –

相關問題