标题已经很清楚了,我的问题是如果我有两个日期时间:
- 01-10-2014 10:00:00
- 01-20-2014 20:00:00
是否可以在这两个日期时间之间选择一个随机的日期时间?
我尝试使用random()函数,但不知道如何将其与日期时间一起使用。
谢谢
Matthiew
是否可以在这两个日期时间之间选择一个随机的日期时间?
我尝试使用random()函数,但不知道如何将其与日期时间一起使用。
谢谢
Matthiew
使用日期/时间运算符,您几乎可以完成所有操作:
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天
是您想要的时间窗口,30天
是将时间窗口推远的距离。这对于通过工作来运行它而不是在设置的时间运行时非常有帮助。
select NOW() + (random() * (NOW()+'90 days' - NOW())) + '30 days';
选择 NOW() + (random() * (interval '90 days')) + '30 days';
。 - Alex Markov您可以通过一个随机整数(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()
,按随机顺序排序,但对于较大的日期间隔,这会使事情变得非常缓慢,因此最好采用上述方法。
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;
random() * interval '<length>'
(在您的情况下为random() * interval '3 days'
),即可达到目的。 - pozs1970-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 Kingma20:00:00
而是10:00:00
吗? - Garyselect timestamp '2014-01-10 20:00:00' + INTERVAL '10 days';
或者 '250 hours' 来适用于 OP 的情况。 - Ernest