计算PostgreSQL数据库中的平均日期

时间:2015-09-23 05:24:23

标签: java sql postgresql

我在PostgreSQL中有一张表,其中包含在不同日期购买的订单。为了存档数据,我们需要合并年份的所有记录,并将其合并为一个记录,平均购买日期根据购买日期计算。

如何计算PostgreSQL中的平均购买日期?或者有没有办法在JAVA中做到这一点?

3 个答案:

答案 0 :(得分: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'以匹配您正在使用的任何年份。

答案 1 :(得分: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 :(得分:0)

java.time

java.time中,如果您想要在日历年的时间范围内使用平均日期,则可以使用ZonedDateTime类及其getDayOfYear方法。

对于超过日历年的时间范围,您可以选择过去的一个点。我建议在UTC的1970年第一时刻的Java时代。查看常量ZoneOffset.UTC。搜索StackOverflow以了解如何获取从早期品脱到每个日期时间实例的天数。平均达到平均日期的天数。