PostgreSQL Получить случайную дату / время между двумя датами / временем
Название довольно явно, мой вопрос, если я получу две даты с часом:
- 01-10-2014 10:00:00
- 01-20-2014 20:00:00
Можно ли выбрать случайное время между этими двумя датами?
Я пытался с функцией random(), но я не понимаю, как использовать его с datetime
Спасибо
Matthiew
4 ответа
Вы можете делать практически все с помощью операторов даты / времени:
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 days
это временное окно, которое вы хотите, и 30 days
насколько далеко выдвинуть временное окно. Это полезно при запуске через задание, а не в установленное время.
select NOW() + (random() * (NOW()+'90 days' - NOW())) + '30 days';
Вы можете построить временную метку из случайного целого числа (Unix Stamp), например:
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(), но это приведет к очень медленной работе с большими интервалами дат, поэтому вам будет лучше с вышеуказанным подходом.
Формула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;