PostgreSQL获取两个日期时间/时间戳之间的随机日期时间/时间戳

Mat*_*iew 28 sql database postgresql datetime timestamp

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

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

是否可以在这两个日期时间之间选择一个随机日期时间?

我尝试使用random()函数,但我真的没有得到如何使用datetime

谢谢

Matthiew

poz*_*ozs 59

您可以使用日期/时间运算符执行几乎所有操作:

select timestamp '2014-01-10 20:00:00' +
       random() * (timestamp '2014-01-20 20:00:00' -
                   timestamp '2014-01-10 10:00:00')
Run Code Online (Sandbox Code Playgroud)

  • @BenjaminPeter需要最后一个区别,因为原始问题以min/max运行.但是如果你有min + length,你可以在末尾添加`random()*interval'<length>'`(在你的情况下`random()*interval'3天'`). (6认同)

Dus*_*tin 10

我改编了@pozs的答案,因为我没有时间戳.

90 days是你想要的时间窗口,30 days是推动时间窗口的距离.当通过作业而不是在设定的时间运行它时,这很有用.

select NOW() + (random() * (NOW()+'90 days' - NOW())) + '30 days';
Run Code Online (Sandbox Code Playgroud)

  • 可以优化为:`select NOW() + (random() * (interval '90 days')) + '30 days';` (4认同)

Den*_*rdy 5

您可以从随机整数(unix 戳)构建时间戳,例如:

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'
Run Code Online (Sandbox Code Playgroud)

如果您经常使用它,请将其包装在 SQL 函数中,因为即使尝试对其进行某种格式化后,它的可读性也不是很好。

另一种方法是使用generate_series()从开始日期到结束日期,按 random() 排序,但这会使较大的日期间隔变得非常缓慢,因此使用上述方法会更好。