44

SQL では、範囲を指定して列にランダムな日時値を挿入できますか?

たとえば、~の範囲が与えられた場合2010-04-30 14:53:272012-04-30 14:53:27

範囲の部分で混乱しています。私はちょうどこれをやったので

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

8 に答える 8

77

これは役立つはずの例です:

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 に変換し直します。

それはかなり近いはずですが、長期間にわたってうるう年やその他の調整がそれを狂わせます.

于 2012-08-10T17:44:27.343 に答える
28

これはうまくいくはずです:

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 から範囲内の秒数の間の乱数になります。このランダムな秒数を範囲の下限に追加すると、データ範囲の境界間の日付がランダムになります。

于 2012-08-10T17:56:46.700 に答える
10

これはうるう年でも完全に機能します:

select from_unixtime(
    unix_timestamp('2000-1-1') + floor(
        rand() * (
            unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
        )
    )
)

アイデアは単純です: 2 つのタイムスタンプの間でランダムなタイムスタンプを取得し、それをdatetimeusingに変換するだけfrom_unixtimeです。このようにして、各オプションの確率が等しいことを確認できます。

于 2015-03-09T14:14:38.483 に答える
7

最も簡単な方法:

INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
于 2014-10-20T13:36:47.683 に答える
5

ちょうど試して :

SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;
于 2016-02-01T17:25:38.863 に答える