Получение случайного интервала времени в postgreSQL - PullRequest
0 голосов
/ 31 декабря 2018

Мне нужен случайный интервал времени от 0 до (10 дней и 5 часов).

Мой код:

select random() * (interval '10 days 5 hours')
from generate_series(1, 50)

Работает как следует, за исключением нескольких странных результатов, таких как:

0 years 0 mons 7 days 26 hours 10 mins 1.353353 secs

Проблема в 26 часов, не должнабыть больше 23. И я никогда не получаю 10 дней, что я хотел бы.

Ответы [ 3 ]

0 голосов
/ 31 декабря 2018

Один из вариантов - использовать интервал в один час, а затем умножить на случайное число от 0 до 1 из серии:

select random() * 245 * interval '1 hour'
from generate_series(1, 50);

Я вижу, что другие ответы предлагают использовать justify_interval.Если вы просто хотите серию интервалов от 0 до 245 часов (245 часов, что соответствует 10 дням и 5 часам), то моего ответа должно быть достаточно.

0 голосов
/ 31 декабря 2018

Попробуйте:

select justify_hours(random() * (interval '245 hours'))
FROM generate_series(1, 50)

См. Документация Postgres для объяснения функций justify_ *.

0 голосов
/ 31 декабря 2018

Интервалы в Postgres довольно гибкие, поэтому значения часов больше 23 не обязательно переносятся на дни.Используйте jusify_interval(), чтобы вернуть их к обычным "дням" и "часам". "

Итак:

select justify_interval(random() * interval '10 day 5 hour')
from generate_series(1, 200)
order by 1 desc;

вернет значения с соответствующими значениями для дней, часов, минут исекунд.

Теперь, почему вы не получаете интервалы с более чем 10 днями? Это простая случайность. Если вы увеличите количество строк до 200 (как указано выше), вы увидите их (во всехвероятность). Если вы запускаете код несколько раз, иногда вы не увидите ничего в этом диапазоне, иногда вы увидите два.

Почему? Вы спрашиваете, как часто вы получаете значение 240+ вдиапазон 245. На эти первые 5 часов приходится 0,02% диапазона (около 1/50). Другими словами, выборка из 50 недостаточно велика - любая конкретная выборка из 50 случайных значений, вероятно, будет отсутствовать 1 или более5-часовой диапазон.

Плюс, без justify_interval() вы, вероятно, в любом случае пропустите их, поскольку они могут отображаться как 9 дней с компонентом часов больше 23.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...