2012-08-10 145 views
26

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

例如,给定的范围2010-04-30 14:53:272012-04-30 14:53:27

我越来越与范围的部分混淆。我将刚才做这个

INSERT INTO `sometable` VALUES (RND (DATETIME())) 
+0

我想用它来测试我的图表 – karto 2012-08-10 17:36:33

+4

@FlorinStingaciu,为什么你会不会想这样做? – Pacerier 2015-03-09 09:18:36

+1

[插入/更新MySQL中的随机日期]的可能重复(http://stackoverflow.com/questions/4546111/insert-update-random-date-in-mysql) – 2015-03-09 15:10:50

回答

43

下面是一个例子,应该帮助:

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。

它应该是非常接近,但在更长的时间段闰年和其他调整将抛出它。

+0

现在试一试。非常感谢 – karto 2012-08-10 17:50:03

+0

@karto,如需处理闰年,请参阅我的解决方案http://stackoverflow.com/a/28944156/632951 – Pacerier 2015-03-09 14:15:23

+0

如果您需要1970年1月1日之前的日期,则不起作用。 – 2017-10-21 15:42:10

18

这应该很好地工作:

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和范围内的秒数之间的随机数。将该随机数加在范围的下限会导致数据范围边界之间的随机数。

5

最简单的方法:

INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR(RAND() * 366) DAY); 
8

这工作完全即使是闰年

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

试试看:

SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name; 
0

这是一个古老的线程,但仍。在我来说,我需要产生这样的格式随机日期:2017年1月1日。 如果有人需要它,我使用了@ drew010解决方案并使用DATE_FORMAT格式化日期。

这里是我的代码:

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');