使用SQL,我可以在给出范围的列中插入随机日期时间值吗?
例如,给定范围2010-04-30 14:53:27
到2012-04-30 14:53:27
我对范围部分感到困惑。因为我刚刚完成了这个
INSERT INTO `sometable` VALUES (RND (DATETIME()))
答案 0 :(得分:54)
以下是一个应该有用的示例:
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。
它应该非常接近,但是在更长的时间段内闰年,其他调整会将其抛弃。
答案 1 :(得分:21)
这应该很好用:
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和范围内的秒数之间的随机数。将此随机秒数添加到范围的下限会导致数据范围边界之间的随机日期。
答案 2 :(得分:9)
即使是闰年,这也非常有效:
select from_unixtime(
unix_timestamp('2000-1-1') + floor(
rand() * (
unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
)
)
)
这个想法很简单:只需在两个时间戳之间取一个随机时间戳,然后使用datetime
将其转换为from_unixtime
。这样,您可以确保每个选项具有相同的概率。
答案 3 :(得分:6)
最简单的出路:
INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
答案 4 :(得分:4)
试试吧:
SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
答案 5 :(得分:1)
这对我有用,但是我的问题有所不同。我必须将列中的某些值分配给随机datetime。
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;
答案 6 :(得分:0)
这是一个旧线程,但仍然..在我的情况下,我需要以这样的格式生成随机日期:2017-01-01。 如果有人需要它,我使用了@ drew010解决方案,并使用DATE_FORMAT格式化日期。
这是我的代码:
SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');
答案 7 :(得分:0)
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