在postgreSQL中获取随机时间间隔

在postgreSQL中获取随机时间间隔,sql,postgresql,intervals,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天。Postgres中的时间间隔非常灵活,因此大于23的小时值不

我需要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\u interval()

因此:

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

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

为什么?你问的是,在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_*函数的解释,请参阅。

您计划如何使用此系列?您计划将其与日期或时间戳一起使用吗?我计划将其与时间戳一起使用upvote真的很奇怪。这肯定没有解决小时数大于23的问题,也没有解释为什么大于10天的时间间隔可能会GordonLinoff我刚刚运行了我的查询,实际上生成了一个242小时的数据点,超过了10天,所以我真的不知道你在说什么“如果不是23,那么假设OP只是使用这些值来抵消时间戳,这应该无关紧要。我的意思是,添加
间隔48小时
应该与
间隔2天
相同,对吗。我的评论是针对投票结果,而不是答案。无论是否相关,OP特别询问大于23的小时值——事实上,OP错过10天以上的原因可能是因为Postgres如何表示时间间隔。这是一个非常好的答案,在某个点上可能是+15。如果可能的话,你今晚应该远离时代广场。@TimBiegeleisen。新年快乐!
select justify_hours(random() * (interval '245 hours'))
FROM generate_series(1, 50)