44

使用 SQL ,我可以在给出范围的列中插入随机日期时间值吗?

例如,给定一个2010-04-30 14:53:27范围2012-04-30 14:53:27

我对范围部分感到困惑。因为我会这样做

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

8 回答 8

77

这是一个应该有帮助的例子:

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。

它应该非常接近,但在更长的时间段内闰年和其他调整将把它扔掉。

于 2012-08-10T17:44:27.343 回答
28

这应该很好地工作:

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 和范围内秒数之间的随机数。将此随机秒数添加到范围的下限会导致数据范围范围之间的随机日期。

于 2012-08-10T17:56:46.700 回答
10

即使闰年也能完美运行:

select from_unixtime(
    unix_timestamp('2000-1-1') + floor(
        rand() * (
            unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
        )
    )
)

这个想法很简单:只需在两个时间戳之间取一个随机时间戳,然后将其转换为datetimeusing from_unixtime。这样,您可以确保每个选项具有相等的概率。

于 2015-03-09T14:14:38.483 回答
7

最简单的出路:

INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
于 2014-10-20T13:36:47.683 回答
5

你试一试 :

SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
于 2016-02-01T17:25:38.863 回答
1

这对我有用,但我的问题有点不同。我必须将列中的某些值分配给随机日期时间。

    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;
于 2018-10-01T09:45:54.460 回答
1
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
于 2019-06-27T10:20:13.000 回答
0

这是一个旧线程,但仍然......在我的情况下,我需要以如下格式生成随机日期:2017-01-01。如果有人需要,我使用了@drew010 解决方案并使用 DATE_FORMAT 格式化日期。

这是我的代码:

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');
于 2017-05-22T06:25:50.313 回答