我有一個事件列表,每個事件都有一個startDate和endDate。我需要知道每場比賽的平均時間。DB2 - 獲得一組日期之間的平均時間
我需要的是這樣的:
select sum ((timestamp(startDate) - timestamp(endDate)) for each event)
/(count of events)
我有一個事件列表,每個事件都有一個startDate和endDate。我需要知道每場比賽的平均時間。DB2 - 獲得一組日期之間的平均時間
我需要的是這樣的:
select sum ((timestamp(startDate) - timestamp(endDate)) for each event)
/(count of events)
你要小心分母,以防止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
它不僅使數學意義上取數值的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,如果需要的話,我們可以選擇任何一種:
除了timestampdiff()返回一個估計值 - 30天的月份,即365天的年份,並且它忽略了DST。根據選擇的分辨率和日期之間的實際距離,這可能會變得很重要。 –
感謝沃倫的回覆:)事實上,第二個查詢計算的差異只考慮了幾天,而我正在考慮全天到秒 – User
你在哪個平臺上 - iSeries,LUW等?目前的答案都使用'timestampdiff(...)',這將給一個_estimate_ - 這可以使用,或者你需要一個「確切」的答案嗎?有沒有可能需要排除的日期? –