2014-04-29 73 views
1

我有一個事件列表,每個事件都有一個startDate和endDate。我需要知道每場比賽的平均時間。DB2 - 獲得一組日期之間的平均時間

我需要的是這樣的:

select sum ((timestamp(startDate) - timestamp(endDate)) for each event) 
    /(count of events) 
+0

你在哪個平臺上 - iSeries,LUW等?目前的答案都使用'timestampdiff(...)',這將給一個_estimate_ - 這可以使用,或者你需要一個「確切」的答案嗎?有沒有可能需要排除的日期? –

回答

1

你要小心分母,以防止0師:SQL0802 - Data Conversion or Data Mapping Error

根據結果的精度,則需要轉換日期。讓我們假設你需要秒(2)

select 
    sum (timestampdiff(2, endDate - startDate)) 
/
    sum (count of events) 
from yourTable 

http://pic.dhe.ibm.com/infocenter/db2luw/v10r5/topic/com.ibm.db2.luw.sql.ref.doc/doc/r0000861.html

+0

感謝AnfocA的回覆:)我需要的結果是天/小時/分鐘 – User

+0

在這種情況下,您需要運行天(16),小時(8)和分鐘(4)的比較。沒有函數返回這個信息。 – AngocA

+0

實際上,當您在兩個日期之間做出差異時,db2會返回一個字符串,表示年,月,日,小時,分鐘,秒(點)微秒的差異 – AngocA

2

它不僅使數學意義上取數值的AVG(),而不是日期時間值或持續時間。既然您希望您的答案以分鐘爲單位精確到分鐘,那麼您希望在幾分鐘內獲得差異,然後再轉換爲日,小時,分鐘。 (有在一個標準的24 * 60 = 1440分鐘)

with q as 
(select avg(
      timestampdiff(4, char(endDate - startDate)) 
      ) as avgmns 
    from yourChosenData 
) 
select int(avgmns/1440) as avg_days, 
     int(mod(avgmns,1440)/60) as avg_mins, 
     mod(avgmns, 60) as avg_secs 
    from q 

如下所述,TIMESTAMPDIFF()是一個估計值。爲了避免這個問題,可以使用更精確的計算。

with q as 
(select avg(
      (days(endDate) - days(startDate)) * 1440 
      + (midnight_seconds(endDate) - midnight_seconds(startDate))/60 
      ) as avgmns 
    from yourChosenData 
) 
select int(avgmns/1440) as avg_days, 
     int(mod(avgmns,1440)/60) as avg_mins, 
     mod(avgmns, 60) as avg_secs 
    from q 

爲了解決這一問題,DST,如果需要的話,我們可以選擇任何一種:

  • 包括對應於每個時間戳字段UTC偏移列。如果時間戳記錄在多個時區中,這也是有用的。然後可以將偏移中的差異與時間戳一起輸入到計算中。
  • 提供確定性的UDF,它可以爲給定的時間戳返回UTC或DST調整偏移量。如果涉及多個時區,則該區域也應該是該函數的參數。根據所涉及的地理區域,邏輯可能還需要考慮觀察替代DST規則的區域。
+0

除了timestampdiff()返回一個估計值 - 30天的月份,即365天的年份,並且它忽略了DST。根據選擇的分辨率和日期之間的實際距離,這可能會變得很重要。 –

+0

感謝沃倫的回覆:)事實上,第二個查詢計算的差異只考慮了幾天,而我正在考慮全天到秒 – User

相關問題