【发布时间】:2011-05-31 13:46:14
【问题描述】:
如何使用 MySQL 在过去 2 周内更新具有随机日期的列?
例如(代码实际上不起作用):
UPDATE mytable
SET col = sysdate() - rand(1, 14);
【问题讨论】:
如何使用 MySQL 在过去 2 周内更新具有随机日期的列?
例如(代码实际上不起作用):
UPDATE mytable
SET col = sysdate() - rand(1, 14);
【问题讨论】:
您的主要问题是RAND() 不允许您指定的值范围。它总是会返回一个介于 0 和 1 之间的值。
我现在无法制定 1..14 随机解决方案,但为了让您开始,这将选择过去 10 天内的随机日期:
SET col = DATE(DATE_SUB(NOW(), INTERVAL ROUND(RAND(1)*10) DAY))
【讨论】:
RAND(seed),种子是可选的。如果指定了种子,它将返回一个可重复的随机数序列。如果未指定种子,则返回完全随机数。因此,您的 RAND(1) 将始终返回相同的值(至少对于 MYSQL)
UPDATE mytable
SET col = CURRENT_DATE - INTERVAL FLOOR(RAND() * 14) DAY
这会将col 设置为当前日期和当前日期之间(包括)的日期 - 13 天。乘以 15 得到当前日期 - 14 天。
【讨论】:
你可以用这个表达式得到一个随机整数:
获取随机整数R 范围 i
FLOOR(i + RAND() * (j - i))。为了 例如,要获得一个随机整数 范围 7SELECT 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;
【讨论】:
一个简单的选择是使用这个查询:
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);
【讨论】: