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

62
标题已经很清楚了,我的问题是如果我有两个日期时间:

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

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

我尝试使用random()函数,但不知道如何将其与日期时间一起使用。

谢谢

Matthiew

4个回答

115

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

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

10
@BenjaminPeter 最后一个差异是必要的,因为原始问题使用最小/最大值。但如果您有min+length,只需在末尾添加 random() * interval '<length>'(在您的情况下为random() * interval '3 days'),即可达到目的。 - pozs
如果您不需要特定的最小/最大值,可以使用时间戳的最小/最大值。在MySql中,时间戳的最小值为1970-01-01 00:00:01,最大值为2038-01-19 03:14:07。假设PostgreSQL中的范围相同,您可以使用select timestamp '1970-01-01 00:00:01' + random() * (timestamp '1970-01-01 00:00:01' - timestamp '2038-01-19 03:14:07')来确保您的时间戳始终在支持的范围内。 - Maiko Kingma
第一行不应该是 20:00:00 而是 10:00:00 吗? - Gary
你也可以使用 INTERVAL,例如 select timestamp '2014-01-10 20:00:00' + INTERVAL '10 days'; 或者 '250 hours' 来适用于 OP 的情况。 - Ernest

33

我根据@pozs的答案进行了改编,因为我没有时间戳可以使用。

90天是您想要的时间窗口,30天是将时间窗口推远的距离。这对于通过工作来运行它而不是在设置的时间运行时非常有帮助。

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

10
可以进行优化,转换为:选择 NOW() + (random() * (interval '90 days')) + '30 days'; - Alex Markov

7

您可以通过一个随机整数(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(),按随机顺序排序,但对于较大的日期间隔,这会使事情变得非常缓慢,因此最好采用上述方法。


Matthiew,你最终使用了这个解决方案吗?你只在这里发表了评论,但另一个回答被标记为已接受的答案... - Kay

0
公式是: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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接