2015-09-23 112 views
0

我在PostgreSQL中有一個表,它有在不同日期購買的訂單。爲了存檔數據,我們需要合併一年中的所有記錄,並將其合併到一個記錄中,並根據購買日期計算平均購買日期。在PostgreSQL中計算平均日期db

如何計算PostgreSQL中的平均購買日期?或者有沒有辦法在JAVA中做到這一點?

+2

呵呵!請提供表格詳細信息(DDL和樣本數據),顯示輸入值以及預期輸出 –

+2

什麼是「平均購買日期」?術語「平均」與日期無關。我不知道日期應該等於'(1 + 2 + 3 + 4 + 5)/ 5',因爲'2015-09-1 + 2015-09-07 + 2015-09-20' doesn'沒有意義 –

+1

@a_horse_with_no_name:我同意這是一個相當古怪的會計慣例,但是在一年內的日期只是'[1,365]'區間內的整數(或閏年中的'[1,366]'),而那些可以平均。如果您選擇合適的時間間隔來覆蓋所有日期,則也可以平均任意日期(即並非全部在同一年)。 –

回答

2

您應該將日期轉換爲一個epoch(秒自1970-01-01 00:00:00),採取的是平均,然後把結果返回到一個日期:

SELECT extract(year from purchase_date) AS year_of_purchase, 
     to_timestamp(avg(extract(epoch from purchase_date)))::date AS avg_purchase_date 
FROM orders 
GROUP BY 1; 

添加其他領域和過濾器根據需要。

2

由於您的日期都是在同一年,因此您可以使用extract將日期轉換爲日期,平均這些數字,然後將其添加回到一年的第一天以獲取日期:

select '2015-01-01'::date 
    + avg(extract(doy from whatever_your_date_column_is))::int 
    - 1 
from ... 

您需要::int造型,因爲avg給你一個雙精度值,但目前還沒有運營商增加雙打日期;需要調整-1,因爲日期值是基於一個而不是基於零的。請注意,adding an integer to a date只是增加了很多天。

您當然會調整'2015-01-01'以匹配您使用的任何一年。

0

java.time

java.time,如果你想在歷年的時間範圍內的平均日期,你可以使用ZonedDateTime類和它的getDayOfYear方法。

對於超過日曆年的時間範圍,您可以選擇過去的某個時間點。我建議在1970年的第一個時刻的Java時代。見常量ZoneOffset.UTC。搜索StackOverflow以瞭解如何獲得從早期品脫到每個日期 - 時間實例的天數。平均達到您平均日期的天數。