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