2012-08-10 142 views
26

使用SQL,我可以在給出範圍的列中插入隨機日期時間值嗎?Mysql在給定的日期時間範圍中插入隨機日期時間

例如,給定的範圍2010-04-30 14:53:272012-04-30 14:53:27

我越來越與範圍的部分混淆。我將剛纔做這個

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

我想用它來測試我的圖表 – karto 2012-08-10 17:36:33

+4

@FlorinStingaciu,爲什麼你會不會想這樣做? – Pacerier 2015-03-09 09:18:36

+1

[插入/更新MySQL中的隨機日期]的可能重複(http://stackoverflow.com/questions/4546111/insert-update-random-date-in-mysql) – 2015-03-09 15:10:50

回答

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 2012-08-10 17:50:03

+0

@karto,如需處理閏年,請參閱我的解決方案http://stackoverflow.com/a/28944156/632951 – Pacerier 2015-03-09 14:15:23

+0

如果您需要1970年1月1日之前的日期,則不起作用。 – 2017-10-21 15:42:10

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 
     ) 
    ) 
) 

的想法很簡單:只取兩個時間戳之間的隨機時間標記,然後將其轉換到datetime使用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');