3

我在 MySql 数据库中创建了一个示例数据集,我需要使用它来测试生成一些报告。对于一个特定的表,我有 10 万条记录,这些记录都是在几个小时内创建的。由于生成示例数据的方式,我无法将 100k 记录上的日期时间列设置为所需的值。

如何使用 SQL 语句随机化 100k 记录上的日期时间列,而不是在几个小时内将它们分散在一个月内?例如,我想将记录平均分布在 2012 年 10 月 1 日到 2012 年 10 月 31 日之间。

4

2 回答 2

2

我们可以使用RAND()函数。按照MySQL 参考手册R,要获取范围内的随机整数i <= R < j,请使用表达式FLOOR(i + RAND() * (j – i))。因此,对于示例表中的每一行,您都需要运行以下查询:

SET @year = '2012';
SET @month = '10';
SET @day = FLOOR(1 + RAND() * (31 - 1));
SET @hour = FLOOR(0 + RAND() * (23 - 0));
SET @minute = FLOOR(0 + RAND() * (59 - 0));
SET @second = FLOOR(0 + RAND() * (59 - 0));

SET @date = CONCAT(@year,'-',@month,'-',@day,'-',@hour,'-',@minute,'-',@second);

UPDATE `sample_tbl`
   SET `date` = STR_TO_DATE(@date,'%Y-%c-%e-%k-%i-%s');
于 2012-11-09T01:26:00.210 回答
1

有趣的问题。我以前需要类似的东西。以下是概念证明。

SET @start_timestamp = 1349049600;
SET @end_timestamp = 1351641600;
SET @offset = @end_timestamp - @start_timestamp;

SELECT FROM_UNIXTIME(@start_timestamp + FLOOR(RAND() * @offset));

失败笔记

虽然MySQL 中存在流控制语句WHILE( 、、LOOP等),但它们仅在存储程序中可用。

我试图直接JOIN针对现有的表SELECT。但是,时间戳始终是相同的值。

我尝试创建一个dates表并使用BENCHMARK(100000, INSERT ...). 但它只接受第二个参数的标量表达式。

最后,您可以通过编写存储程序来克服上述所有问题。但是,这似乎有点矫枉过正,因为我相信在您的情况下将此 POC 改编为您的原始脚本是最有意义的。

于 2012-11-09T01:28:32.727 回答