我需要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天的时间。
答案 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个小时),那么我的答案就足够了。