使用SQL,我可以在给定范围的列中插入随机日期时间值吗?例如,给定范围2010-04-30 14:53:27到2012-04-30 14:53:27我搞不清楚范围的部分。因为我刚刚做了这个
2010-04-30 14:53:27
2012-04-30 14:53:27
INSERT INTO `sometable` VALUES (RND (DATETIME()))
ppcbkaq51#
下面是一个应该有所帮助的示例:
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。它应该是相当接近,但在更长的时间段闰年和其他调整将抛出它。
z8dt9xmd2#
这应该可以很好地工作:
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和范围中秒数之间的随机数。将此随机秒数与范围的下限相加将得到数据范围边界之间的随机日期。
TIMESTAMPDIFF
nzkunb0c3#
这种方法即使在闰年也能完美工作:
select from_unixtime( unix_timestamp('2000-1-1') + floor( rand() * ( unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1 ) ) )
这个想法很简单:只需在两个时间戳之间取一个随机时间戳,然后使用from_unixtime将其转换为datetime,这样就可以确保每个选项的概率相等。
from_unixtime
datetime
mwecs4sa4#
最简单的解决方法:
INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
carvr3hs5#
试试看:
SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
8hhllhi26#
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
yqlxgs2m7#
这对我很有效,但我的问题有点不同。我必须将一列中的某些值赋给一个随机的日期时间。
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;
fae0ux8s8#
这是一个老线程,但仍然..在我的情况下,我需要生成随机日期的格式如下:2017-01-01.如果有人需要它,我已经使用@drew010解决方案,并使用DATE_FORMAT格式化日期。下面是我的代码:
SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');
aelbi1ox9#
使用以下动态查询。
SET @MIN = NOW() - INTERVAL 2 MONTH; SET @MAX = now(); select TIMESTAMPADD(SECOND, FLOOR(RAND() * TIMESTAMPDIFF(SECOND, @MIN, @MAX)), @MIN)
感谢@sapna-bhayal
9条答案
按热度按时间ppcbkaq51#
下面是一个应该有所帮助的示例:
它使用日期
2010-04-30 14:53:27
作为基准,将其转换为Unix时间戳,并将从0到+2年的随机秒数添加到基准日期,然后将其转换回DATETIME。它应该是相当接近,但在更长的时间段闰年和其他调整将抛出它。
z8dt9xmd2#
这应该可以很好地工作:
TIMESTAMPDIFF
用于确定日期范围中的秒数。将此值乘以0-1之间的随机数将得到0和范围中秒数之间的随机数。将此随机秒数与范围的下限相加将得到数据范围边界之间的随机日期。nzkunb0c3#
这种方法即使在闰年也能完美工作:
这个想法很简单:只需在两个时间戳之间取一个随机时间戳,然后使用
from_unixtime
将其转换为datetime
,这样就可以确保每个选项的概率相等。mwecs4sa4#
最简单的解决方法:
carvr3hs5#
试试看:
8hhllhi26#
yqlxgs2m7#
这对我很有效,但我的问题有点不同。我必须将一列中的某些值赋给一个随机的日期时间。
fae0ux8s8#
这是一个老线程,但仍然..在我的情况下,我需要生成随机日期的格式如下:2017-01-01.如果有人需要它,我已经使用@drew010解决方案,并使用DATE_FORMAT格式化日期。
下面是我的代码:
aelbi1ox9#
使用以下动态查询。
感谢@sapna-bhayal