PostgreSQL获取两个datetime/timestamp之间的随机datetime/timestamp

izj3ouym  于 2023-06-05  发布在  PostgreSQL
关注(0)|答案(4)|浏览(230)

标题相当明确,我的问题是如果我得到两个小时的日期:

  • 2014 - 01-10 10:00:00
  • 2014 - 01-20 20:00:00

是否可以在这两个日期时间之间随机选择一个日期时间?
我尝试使用random()函数,但我真的不知道如何在datetime中使用它
谢谢
马修

liwlm1x9

liwlm1x91#

你可以用date/time operators做几乎所有的事情:

select timestamp '2014-01-10 20:00:00' +
       random() * (timestamp '2014-01-20 20:00:00' -
                   timestamp '2014-01-10 10:00:00')
xa9qqrwz

xa9qqrwz2#

我改编了@pozs的答案,因为我没有时间戳可以关闭。
90 days是您想要的时间窗口,30 days是将时间窗口推出去多远。这在通过作业而不是在设定的时间运行它时很有帮助。

select NOW() + (random() * (NOW()+'90 days' - NOW())) + '30 days';
cclgggtu

cclgggtu3#

你可以从一个随机整数(unix stamp)构建时间戳,例如:

select timestamp 'epoch' + (
          extract('epoch' from timestamp '2014-10-01 10:00:00')
        + random() * (
                     extract('epoch' from timestamp '2014-20-01 20:00:00')
                   - extract('epoch' from timestamp '2014-10-01 10:00:00')
       )) * interval '1 second'

如果您经常使用它,请将其 Package 在SQL函数中,因为即使尝试对其进行某种格式化,它也不是很可读。
另一种方法是从开始日期到结束日期使用generate_series(),按random()排序,但这会使时间间隔更大的事情变得非常缓慢,因此您最好使用上述方法。

vpfxa7rd

vpfxa7rd4#

公式为SELECT random() * (b - a) + a;,其中a是要生成随机数的最小数字,b是要生成随机数的最大数字。

SELECT random() * (timestamp '2023-09-01 20:00:00' - timestamp '2023-09-01 10:00:00') + timestamp '2023-09-01 10:00:00';

SELECT random() * ('2023-09-01 20:00:00'::timestamp - '2023-09-01 10:00:00'::timestamp) + '2023-09-01 10:00:00'::timestamp;

相关问题