如何按日期顺序计算日期之间的平均天数

Posted

技术标签:

【中文标题】如何按日期顺序计算日期之间的平均天数【英文标题】:How to calculate average number of days between dates in date order 【发布时间】:2019-09-10 11:25:49 【问题描述】:

表格包含订单日期

create table orderdate ( orderdate date not null )

如何计算表格中日期之间的平均天数。 需要计算日期顺序中相邻日期之间的差异,以找到订单之间的平均日期数。

将此数字添加到最后一个订单日期会产生估计的下一个订单日期。

例如,如果表包含

2019-09-10
2019-09-21
2019-09-25

订单之间的差异是 10 天和 4 天,平均差异是

(10+4)/2 = 7 days

下一个订单预计日期为 2019-09-25 + 7 = 2019-10-02

使用

PostgreSQL 9.4.19

【问题讨论】:

4 是 25-21。需要按日期顺序计算相邻日期之间的差异。我更新了问题 啊,好吧,我误会了。我以为你想得到一个平均日期...... 我再次更新了问题以提供更多信息。我需要根据以前订单的日期估算下一个订单日期 【参考方案1】:

你可以使用聚合:

select ( max(date) - min(date) ) / nullif(count(*) - 1, 0) as avg_duration
from t;

间隙数比计数少一。因此,平均值是总持续时间除以间隔数。

【讨论】:

这并不使用所有的订单日期。我需要按日期顺序获取两个日期之间的平均天数。将此添加到最后一个订单日期会产生我需要的下一个订单日期的估计。我更新了问题。 当然,这可行: AVG(10, 21, 25) = MAX() - MIN() / (COUNT() - 1) = 25 - 10 / (3 - 1) = 7.5 @Andrus。 . .这确实有效。答案甚至解释了它是如何工作的。 订单之间的平均天数取决于所有订单日期。您的查询未使用表中的所有订购日期。它仅使用第一个和最后一个日期。所以它不能产生正确的结果。 Laurenz Albe 的回答奏效了。 @Andrus。 . .这是不正确的。平均数字取决于第一个和最后一个日期以及间隔的数量——这就是数学的工作方式。试试看。【参考方案2】:

先计算相邻日期的差,再取平均值:

SELECT avg(CAST(days_between AS double precision))
FROM (SELECT orderdate
             - (lag(orderdate) OVER (ORDER BY orderdate)) AS days_between
      FROM orderdate) AS q;

我转换为double precision,因为两个dates 之间的区别是integer

【讨论】:

谢谢。有效。但是我将 Gordon Linoff 的答案标记为答案,因为它更简单。

以上是关于如何按日期顺序计算日期之间的平均天数的主要内容,如果未能解决你的问题,请参考以下文章

如何用PHP+MySQL计算两个日期之间的月份数和其余下的天数?

vfp中要计算两个日期间相差天数如何编写程序?

oracle 日期计算

c#如何计算两个日期之间相隔天数

如何写计算两个日期之间的天数函数

C++ 计算两个日期之间的天数