在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。
我需要 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。