2012-08-10 12 views
26

एसक्यूएल के साथ, क्या मैं एक कॉलम में यादृच्छिक डेटाटाइम मान डाल सकता हूं?MySQL एक दिए गए डेटाटाइम रेंज में यादृच्छिक डेटाटाइम डालें

उदाहरण के लिए

, की 2010-04-30 14:53:272012-04-30 14:53:27

को मैं सीमा हिस्सा के साथ भ्रमित हो रही एक सीमा दी। के रूप में मैं सिर्फ इस

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

मैं इसे उपयोग करने के लिए मेरे चार्ट – karto

+4

@FlorinStingaciu परीक्षण करना चाहते हैं, क्यों आप ऐसा करना नहीं चाहता:

यहाँ मेरी कोड है? – Pacerier

+1

संभव डुप्लिकेट [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 का उपयोग करता है, धर्मान्तरित एक यूनिक्स टाइमस्टैम्प करने के लिए कि, और एक यादृच्छिक संख्या कहते हैं 0 से +2 साल के आधार पर आधार की तारीख तक और इसे वापस DATETIME में परिवर्तित कर देता है।

यह बहुत करीब होना चाहिए लेकिन लंबी अवधि की अवधि में लीप साल और अन्य समायोजन इसे फेंक देंगे।

+0

अभी आज़माएं। बहुत धन्यवाद – karto

+0

@ कार्टो, लीप वर्षों को संभालने के लिए, मेरा समाधान देखें http://stackoverflow.com/a/28944156/632951 – Pacerier

+0

यदि आपको 1/1/1970 से पहले तिथियों की आवश्यकता है तो काम नहीं करता है। –

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

विचार सरल है: बस, दो टाइमस्टैंप के बीच एक यादृच्छिक टाइमस्टैम्प ले तो यह परिवर्तित from_unixtime का उपयोग कर datetime पर। इस तरह आप यह सुनिश्चित कर सकते हैं कि प्रत्येक विकल्प की समान संभावना है।

4

बस कोशिश:

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

यह एक पुराने धागा है, लेकिन अभी भी .. मेरे मामले में मैं इस तरह के प्रारूप में यादृच्छिक तारीख उत्पन्न करने के लिए की जरूरत: 2017/01/01। यदि किसी को इसकी आवश्यकता होगी तो मैंने @ drew010 समाधान और प्रारूपित दिनांक DATE_FORMAT के साथ उपयोग किया है।

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d'); 
संबंधित मुद्दे