在 MySQL 中插入/更新随机日期

Posted

技术标签:

【中文标题】在 MySQL 中插入/更新随机日期【英文标题】:Insert/ Update random date in MySQL 【发布时间】:2011-05-31 13:46:14 【问题描述】:

如何使用 mysql 在过去 2 周内更新具有随机日期的列?

例如(代码实际上不起作用):

UPDATE mytable
SET col = sysdate() - rand(1, 14);

【问题讨论】:

【参考方案1】:

您的主要问题是RAND() 不允许您指定的值范围。它总是会返回一个介于 0 和 1 之间的值。

我现在无法制定 1..14 随机解决方案,但为了让您开始,这将选择过去 10 天内的随机日期:

SET col = DATE(DATE_SUB(NOW(), INTERVAL ROUND(RAND(1)*10) DAY)) 

【讨论】:

RAND(seed),种子是可选的。如果指定了种子,它将返回一个可重复的随机数序列。如果未指定种子,则返回完全随机数。因此,您的 RAND(1) 将始终返回相同的值(至少对于 MYSQL)【参考方案2】:
UPDATE mytable
SET col = CURRENT_DATE - INTERVAL FLOOR(RAND() * 14) DAY

这会将col 设置为当前日期和当前日期之间(包括)的日期 - 13 天。乘以 15 得到当前日期 - 14 天。

【讨论】:

【参考方案3】:

你可以用这个表达式得到一个随机整数:

获取随机整数R 范围 i FLOOR(i + RAND() * (j - i))。为了 例如,要获得一个随机整数 范围 7

SELECT FLOOR(7 + (RAND() * 5));

https://dev.mysql.com/doc/refman/8.0/en/mathematical-functions.html#function_rand

使用它来生成随机的天数、小时数或分钟数(取决于分辨率)并将该数字添加到当前日期。

完整的表达式是:

-- Date only
SELECT CURRENT_DATE - INTERVAL FLOOR(RAND() * 14) DAY;
-- Date and time
SELECT CURRENT_TIMESTAMP - INTERVAL FLOOR(RAND() * 14 * 24 * 60 *60) SECOND;

Demo

【讨论】:

这是一个非常古老的答案和一个非常古老的问题,但这解决了我必须引入 300 多个随机日期的问题。谢谢! @IsmaelMiguel,这实际上是一种非常间接的方式。使用时间戳***.com/a/28944156/632951,更直接,更不容易出错。 @Pacerier - 这两种方法对我来说都很好(而且非常相似)。您想到了哪些潜在的错误? @Pacerier 您的建议确实很强大,但我想要的只是一个非常基本且快速的原型。日期的准确性不是必需的。我只需要随机日期。 @ÁlvaroG.Vicario,当我们需要将“过去 2 周”更改为“过去 2 个月”等其他内容时。我的解决方案更直接且可扩展到所有用例,因为它只是指定一个 start_date 和一个 end_date。【参考方案4】:

一个简单的选择是使用这个查询:

UPDATE mytable
SET col = (
    NOW() - INTERVAL FLOOR(RAND() * 14) DAY 
    + INTERVAL FLOOR(RAND() * 23) HOUR
    + INTERVAL FLOOR(RAND() * 59) MINUTE
    + INTERVAL FLOOR(RAND() * 59) SECOND
);

或者,更优雅:

UPDATE mytable
SET col = (NOW() - INTERVAL FLOOR(RAND() * 14 * 24 * 60 * 60) SECOND);

【讨论】:

以上是关于在 MySQL 中插入/更新随机日期的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 生成日期表

使用 PreparedStatement 将日期插入 MySQL 数据库

MySQL数据类型 - 日期和时间类型

timestamp是啥类型数据

在 MySQL 中使用带有日期的连接字符串创建触发器

mysql 数据类型TIMESTAMP