Mysql在给定日期时间范围内插入随机日期时间

ogsagwnx  于 2022-11-28  发布在  Mysql
关注(0)|答案(9)|浏览(156)

使用SQL,我可以在给定范围的列中插入随机日期时间值吗?
例如,给定范围2010-04-30 14:53:272012-04-30 14:53:27
我搞不清楚范围的部分。因为我刚刚做了这个

INSERT INTO `sometable` VALUES (RND (DATETIME()))
ppcbkaq5

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。
它应该是相当接近,但在更长的时间段闰年和其他调整将抛出它。

z8dt9xmd

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和范围中秒数之间的随机数。将此随机秒数与范围的下限相加将得到数据范围边界之间的随机日期。

nzkunb0c

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,这样就可以确保每个选项的概率相等。

mwecs4sa

mwecs4sa4#

最简单的解决方法:

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

carvr3hs5#

试试看:

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

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
yqlxgs2m

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;
fae0ux8s

fae0ux8s8#

这是一个老线程,但仍然..在我的情况下,我需要生成随机日期的格式如下:2017-01-01.如果有人需要它,我已经使用@drew010解决方案,并使用DATE_FORMAT格式化日期。
下面是我的代码:

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

aelbi1ox9#

使用以下动态查询。

SET @MIN = NOW() - INTERVAL 2 MONTH;
SET @MAX = now();

select TIMESTAMPADD(SECOND, FLOOR(RAND() * TIMESTAMPDIFF(SECOND, @MIN, @MAX)), @MIN)

感谢@sapna-bhayal

相关问题