【发布时间】:2014-05-22 18:09:55
【问题描述】:
标题非常明确,我的问题是如果我得到两个小时的日期:
- 01-10-2014 10:00:00
- 01-20-2014 20:00:00
是否可以在这两个日期时间之间选择一个随机的日期时间?
我尝试了 random() 函数,但我真的不知道如何将它与 datetime 一起使用
谢谢
马修
【问题讨论】:
标签: sql database postgresql datetime timestamp
标题非常明确,我的问题是如果我得到两个小时的日期:
是否可以在这两个日期时间之间选择一个随机的日期时间?
我尝试了 random() 函数,但我真的不知道如何将它与 datetime 一起使用
谢谢
马修
【问题讨论】:
标签: sql database postgresql datetime timestamp
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')
【讨论】:
random() * interval '<length>'(在你的情况下是random() * interval '3 days')。
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吗?
我调整了@pozs 的答案,因为我没有时间戳可以关闭。
90 days 是您想要的时间窗口,30 days 是推动时间窗口的距离。这在通过作业而不是在设定的时间运行时很有帮助。
select NOW() + (random() * (NOW()+'90 days' - NOW())) + '30 days';
【讨论】:
select NOW() + (random() * (interval '90 days')) + '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() 排序,但这会使日期间隔较大的事情变得非常慢,所以你会更好以上方法。
【讨论】: