我在PostgreSQL中有一张表,其中包含在不同日期购买的订单。为了存档数据,我们需要合并年份的所有记录,并将其合并为一个记录,平均购买日期根据购买日期计算。
如何计算PostgreSQL中的平均购买日期?或者有没有办法在JAVA中做到这一点?
答案 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中,如果您想要在日历年的时间范围内使用平均日期,则可以使用ZonedDateTime
类及其getDayOfYear
方法。
对于超过日历年的时间范围,您可以选择过去的一个点。我建议在UTC的1970年第一时刻的Java时代。查看常量ZoneOffset.UTC
。搜索StackOverflow以了解如何获取从早期品脱到每个日期时间实例的天数。平均达到平均日期的天数。