2015-09-23 96 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以了解如何获得从早期品脱到每个日期 - 时间实例的天数。平均达到您平均日期的天数。