2012-08-10 25 views
26

SQLでは、範囲を与える列にランダムなdatetime値を挿入できますか?Mysqlは、与えられたdatetimeの範囲でランダムなdatetimeを挿入します

例えば、2012-04-30 14:53:27

から2010-04-30 14:53:27の範囲与えられた私は、範囲の部分で混乱しています。私はちょうどここでは、この

INSERT INTO `sometable` VALUES (RND (DATETIME())) 
+0

私はなぜあなたはこれを行うにはしたくないだろう、 – karto

+4

@FlorinStingaciu私のチャートをテストするためにそれを使用したいですか? – Pacerier

+1

[MySQLのランダムな日付の挿入/更新](MySQLのランダムな日付の複製)の可能な複製(http://stackoverflow.com/questions/4546111/insert-update-random-date-in-mysql) –

答えて

43

を行っているだろうとして役立つはず例です。

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

これはかなり近いはずですが、より長い期間で閏年を調整し、他の調整を行うと捨てられます。

+0

今すぐ試してください。ありがとうございました – karto

+0

@karto、うるう年の処理については、私の解決策を参照してください。http://stackoverflow.com/a/28944156/632951 – Pacerier

+0

1970年1月1日より前の日付が必要な場合は機能しません。 –

18

これはうまく動作するはずです:

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

5

最も簡単な方法アウト:

INSERT INTO `sometable` VALUES (SELECT timestamp('2010-04-30 14:53:27') - INTERVAL FLOOR(RAND() * 366) DAY); 
8

これも、うるう年のために完璧に作品:

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

考え方は単純です:ちょうどそれを変換し、その後、2つのタイムスタンプ間のランダムなタイムスタンプを取りますにfrom_unixtimeを使用してください。こうすることで、各オプションの確率が等しくなるようにすることができます。

4

ただ、試してみてください。

SELECT TIMESTAMP('2012-04-30 14:53:27')-INTERVAL RAND()*365*2 DAY INTO tbl_name; 
0

をそれは古いスレッドですが、まだ...私の場合、私はこのような形式でランダムな日付を生成するために必要な:2017年1月1日。 誰かがそれを必要とするならば、私は@ drew010解決策を使用して、日付をDATE_FORMATでフォーマットしました。ここで

は私のコードです:

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d'); 
関連する問題