在PostgreSQL中获取随机时间间隔

时间:2018-12-31 14:52:07

标签: sql postgresql intervals

我需要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天的时间。

3 个答案:

答案 0 :(得分:3)

Postgres中的时间间隔非常灵活,因此大于23的小时值不一定会累积到几天。使用jusify_interval()将其恢复为正常的“天”和“小时”。

所以:

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

将返回具有天,小时,分钟和秒的适当值的值。

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

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

此外,如果没有justify_interval(),您仍然可能会错过这些内容,因为它们可能会显示为9天,且小时数大于23。

答案 1 :(得分:2)

尝试一下:

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

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

答案 2 :(得分:1)

一种选择是使用一个小时的间隔,然后乘以该序列中介于0和1之间的随机数:

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

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