在postgreSQL中获取随机时间间隔

Getting random time interval in postgreSQL

我需要 0 到(10 天零 5 小时)之间的随机间隔时间。

我的代码:

select random() * (interval '10 days 5 hours')
from generate_series(1, 50)

除了一些奇怪的结果外,一切正常,例如:

0 years 0 mons 7 days 26 hours 10 mins 1.353353 secs

问题是26小时,应该不会超过23小时。而且我从来没有得到10天,我想要什么。

Postgres 中的时间间隔非常灵活,因此大于 23 的小时值不一定滚动到天。使用 jusify_interval() 到 return 它们到正常的 "days" 和 "hours"."

所以:

select justify_interval(random() * interval '10 day 5 hour')
from generate_series(1, 200)
order by 1 desc;

将 return 值与天、小时、分钟和秒的适当值。

现在,为什么你没有得到超过 10 天的间隔?这是简单的随机性。如果将行数增加到 200(如上),您将看到它们(很有可能)。如果您多次 运行 代码,有时您会在该范围内看到 none;有时你会看到两个。

为什么?您问的是在 245 的范围内多久获得 240+ 的值。前 5 个小时占范围的 0.02%(约 1/50)。换句话说,50 个样本不够大——任何给定的 50 个随机值样本都可能丢失 1 个或更多 5 小时范围。

此外,如果没有 justify_interval(),您很可能会错过这些,因为它们可能显示为 9 天,其中的小时数大于 23。

一个选择是使用一小时的间隔,然后乘以来自该系列的 0 到 1 之间的随机数:

select random() * 245 * interval '1 hour'
from generate_series(1, 50);

我可以看到其他答案建议使用 justify_interval。如果你只是想要0到245小时之间的一系列间隔(245小时对应10天5小时),那么我的答案就足够了。

试试这个:

select justify_hours(random() * (interval '245 hours'))
FROM generate_series(1, 50)

有关 justify_* 函数的说明,请参阅 Postgres Documentation