SQL では、範囲を指定して列にランダムな日時値を挿入できますか?
たとえば、~の範囲が与えられた場合2010-04-30 14:53:27
、2012-04-30 14:53:27
範囲の部分で混乱しています。私はちょうどこれをやったので
INSERT INTO `sometable` VALUES (RND (DATETIME()))
これは役立つはずの例です:
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 に変換し直します。
それはかなり近いはずですが、長期間にわたってうるう年やその他の調整がそれを狂わせます.
これはうまくいくはずです:
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 から範囲内の秒数の間の乱数になります。このランダムな秒数を範囲の下限に追加すると、データ範囲の境界間の日付がランダムになります。
これはうるう年でも完全に機能します:
select from_unixtime(
unix_timestamp('2000-1-1') + floor(
rand() * (
unix_timestamp('2010-12-31') - unix_timestamp('2000-1-1') + 1
)
)
)
アイデアは単純です: 2 つのタイムスタンプの間でランダムなタイムスタンプを取得し、それをdatetime
usingに変換するだけfrom_unixtime
です。このようにして、各オプションの確率が等しいことを確認できます。
最も簡単な方法:
INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR( RAND( ) * 366) DAY);
ちょうど試して :
SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name;