Mysql вставляет случайное время datetime в заданный диапазон времени жизни
С SQL, могу ли я вставлять случайные значения даты и времени в столбец, задавая диапазон?
Например, для диапазона от 2010-04-30 14:53:27
до 2012-04-30 14:53:27
Я запутался с частью диапазона. как я только что сделал это
INSERT INTO `sometable` VALUES (RND (DATETIME()))
Ответы
Ответ 1
Вот пример, который должен помочь:
INSERT INTO `sometable` VALUES(
FROM_UNIXTIME(
UNIX_TIMESTAMP('2010-04-30 14:53:27') + FLOOR(0 + (RAND() * 63072000))
)
)
Он использует дату 2010-04-30 14:53:27
в качестве базы, преобразует ее в временную метку Unix и добавляет случайное число секунд от 0 до +2 лет к базовой дате и преобразует ее обратно в DATETIME.
Это должно быть довольно близко, но в течение более длительных периодов времени високосные годы и другие корректировки будут его отключать.
Ответ 2
Это должно хорошо работать:
SET @MIN = '2010-04-30 14:53:27';
SET @MAX = '2012-04-30 14:53:27';
SELECT TIMESTAMPADD(SECOND, FLOOR(RAND() * TIMESTAMPDIFF(SECOND, @MIN, @MAX)), @MIN);
TIMESTAMPDIFF
используется для определения количества секунд в диапазоне дат. Умножьте это на случайное число между 0-1 и получим случайное число между 0 и числом секунд в диапазоне. Добавление этого случайного числа секунд в нижнюю границу диапазона приводит к случайной дате между границами диапазона данных.
Ответ 3
Это прекрасно работает даже в високосные годы:
select from_unixtime(
unix_timestamp('2000-1-1') + floor(
rand() * (
unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
)
)
)
Идея проста: Просто случайная метка времени между двумя отметками, а затем преобразовать его в datetime
с помощью from_unixtime
. Таким образом, вы можете гарантировать, что каждый вариант имеет равную вероятность.
Ответ 4
Самый простой выход:
INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
Ответ 5
Просто попробуйте:
SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
Ответ 6
Это сработало для меня, но моя проблема была немного другой. Мне пришлось назначить определенные значения в столбце случайной дате и времени.
UPDATE Tablename
SET columnName = addtime(concat_ws(' ','2018-07-25' + interval rand()*2 day
,'00:00:00'),sec_to_time(floor(0 + (rand() * 86401))))
WHERE columnName = condition;
Ответ 7
Это старый поток, но все же... В моем случае мне нужно было создать случайную дату в таком формате: 2017-01-01.
Если кому-то это понадобится, я использовал решение @drew010 и отформатированную дату с DATE_FORMAT.
Вот мой код:
SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');
Ответ 8
SET @MIN = '2019-06-29 00:53:27';
SET @MAX = '2019-06-29 13:53:27';
UPDATE tablename
SET columnname = TIMESTAMPADD(SECOND, FLOOR(RAND() * TIMESTAMPDIFF(SECOND, @MIN, @MAX)), @MIN)
WHERE 'columnname' = condition