使用SQL,我可以在给出范围的列中插入随机日期时间值吗?Mysql在给定的日期时间范围中插入随机日期时间
例如,给定的范围2010-04-30 14:53:27
到2012-04-30 14:53:27
我越来越与范围的部分混淆。我将刚才做这个
INSERT INTO `sometable` VALUES (RND (DATETIME()))
使用SQL,我可以在给出范围的列中插入随机日期时间值吗?Mysql在给定的日期时间范围中插入随机日期时间
例如,给定的范围2010-04-30 14:53:27
到2012-04-30 14:53:27
我越来越与范围的部分混淆。我将刚才做这个
INSERT INTO `sometable` VALUES (RND (DATETIME()))
下面是一个例子,应该帮助:
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。
它应该是非常接近,但在更长的时间段闰年和其他调整将抛出它。
这应该很好地工作:
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和范围内的秒数之间的随机数。将该随机数加在范围的下限会导致数据范围边界之间的随机数。
最简单的方法:
INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR(RAND() * 366) DAY);
这工作完全即使是闰年:
select from_unixtime(
unix_timestamp('2000-1-1') + floor(
rand() * (
unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
)
)
)
的想法很简单:只取两个时间戳之间的随机时间标记,然后将其转换到datetime
使用from_unixtime
。这样可以确保每个选项具有相等的概率。
试试看:
SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
这是一个古老的线程,但仍。在我来说,我需要产生这样的格式随机日期:2017年1月1日。 如果有人需要它,我使用了@ drew010解决方案并使用DATE_FORMAT格式化日期。
这里是我的代码:
SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');
我想用它来测试我的图表 – karto 2012-08-10 17:36:33
@FlorinStingaciu,为什么你会不会想这样做? – Pacerier 2015-03-09 09:18:36
[插入/更新MySQL中的随机日期]的可能重复(http://stackoverflow.com/questions/4546111/insert-update-random-date-in-mysql) – 2015-03-09 15:10:50