Подтвердить что ты не робот

Mysql вставляет случайное время datetime в заданный диапазон времени жизни

С SQL, могу ли я вставлять случайные значения даты и времени в столбец, задавая диапазон?

Например, для диапазона от 2010-04-30 14:53:27 до 2012-04-30 14:53:27

Я запутался с частью диапазона. как я только что сделал это

INSERT INTO `sometable` VALUES (RND (DATETIME())) 
4b9b3361

Ответ 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