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 获取两个日期时间/时间戳之间的随机日期时间/时间戳的主要内容,如果未能解决你的问题,请参考以下文章