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

Posted

技术标签:

【中文标题】PostgreSQL 获取两个日期时间/时间戳之间的随机日期时间/时间戳【英文标题】:PostgreSQL Get a random datetime/timestamp between two datetime/timestamp 【发布时间】:2014-05-22 18:09:55 【问题描述】:

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

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

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

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

谢谢

马修

【问题讨论】:

【参考方案1】:

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')

【讨论】:

@BenjaminPeter 最后一个区别是需要的,因为原始问题以最小值/最大值运行。但是如果你有 min + length,你可以在末尾添加random() * interval '<length>'(在你的情况下是random() * interval '3 days')。 如果您不需要特定的最小/最大值,您可以使用时间戳的最小/最大值。在 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') 确保您的时间戳始终在支持的范围内。 第一行不应该是10:00:00而不是20:00:00吗?【参考方案2】:

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

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

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

【讨论】:

可以优化成:select NOW() + (random() * (interval '90 days')) + '30 days';【参考方案3】:

您可以从一个随机整数(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() 排序,但这会使日期间隔较大的事情变得非常慢,所以你会更好以上方法。

【讨论】:

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

以上是关于PostgreSQL 获取两个日期时间/时间戳之间的随机日期时间/时间戳的主要内容,如果未能解决你的问题,请参考以下文章

从没有时间戳列的数据库表中增量获取两个日期之间的记录

检查两个日期之间的时间戳

将时间戳与查询中的日期名称相等,并在 PostgreSQL 查询中获取结果集 w.r.t 日期名称

Redshift - 在两个日期之间添加日期(月间隔)

Hivesql计算两个时间戳相差的分钟数

使用时间戳列在 postgresql 上联合加入