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



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

  • 2014年10月1日10:00:00
  • 2014年1月20日20:00:00

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

我试过使用random()函数,但我真的不知道如何将其与datetime 一起使用

感谢

Matthew

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

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

我调整了@pozs的答案,因为我没有时间戳。

90 days是您想要的时间窗口,30 days是推送时间窗口的距离。当通过作业而不是在设定的时间运行它时,这很有帮助。

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

您可以从一个随机整数(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'

如果您经常使用它,请将其封装在SQL函数中,因为即使在尝试格式化它之后,它也不太可读。

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

公式为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;

相关内容

  • 没有找到相关文章