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;
Другие вопросы по тегам