使用SQL,我可以在给出范围的列中插入随机日期时间值吗?
例如,给定范围2010-04-30 14:53:27
为2012-04-30 14:53:27
我对范围部分感到困惑.因为我会这样做的
INSERT INTO `sometable` VALUES (RND (DATETIME()))
Run Code Online (Sandbox Code Playgroud)
dre*_*010 61
这是一个应该有用的示例:
INSERT INTO `sometable` VALUES(
FROM_UNIXTIME(
UNIX_TIMESTAMP('2010-04-30 14:53:27') + FLOOR(0 + (RAND() * 63072000))
)
)
Run Code Online (Sandbox Code Playgroud)
它使用日期2010-04-30 14:53:27
作为基础,将其转换为Unix时间戳,并将0到+ 2年的随机秒数添加到基准日期,并将其转换回DATETIME.
它应该非常接近,但是在更长的时间段内闰年,其他调整将会摒弃它.
Bre*_*den 22
这应该很好地工作:
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);
Run Code Online (Sandbox Code Playgroud)
TIMESTAMPDIFF
用于确定日期范围内的秒数.将其乘以0-1之间的随机数,得到0和范围内的秒数之间的随机数.将此随机秒数添加到范围的下限会导致数据范围边界之间的随机日期.
即使是闰年,这也完美无缺:
select from_unixtime(
unix_timestamp('2000-1-1') + floor(
rand() * (
unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
)
)
)
Run Code Online (Sandbox Code Playgroud)
这个想法很简单:只需在两个时间戳之间取一个随机时间戳,然后将其转换为datetime
使用时间戳from_unixtime
.这样,您可以确保每个选项具有相同的概率.
小智 6
最简单的出路:
INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
Run Code Online (Sandbox Code Playgroud)
你试一试 :
SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
Run Code Online (Sandbox Code Playgroud)