3

MySqlデータベースにサンプルデータセットを作成しました。これを使用して、いくつかのレポートの生成をテストする必要があります。ある特定のテーブルについて、互いに数時間以内にすべて作成された10万件のレコードがあります。サンプルデータの生成方法が原因で、100kレコードの日時列を目的の値に設定できませんでした。

SQLステートメントを使用して100kレコードの日時列をランダム化し、互いに数時間以内に配置するのではなく、1か月に分散させるにはどうすればよいですか?例として、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 ...)。ただし、2番目の引数のスカラー式のみを受け入れます。

結局、ストアドプログラムを作成することで、上記のすべてを克服することができます。ただし、このPOCを元のスクリプトに適合させるのが最も理にかなっていると私が信じているので、それはやり過ぎのように見えました。

于 2012-11-09T01:28:32.727 に答える