2012-08-10 13 views
26

Con SQL, è possibile inserire valori datetime casuali in una colonna che fornisce un intervallo?Mysql inserisce un datetime casuale in un determinato intervallo datetime

Ad esempio, data una serie di 2010-04-30 14:53:27-2012-04-30 14:53:27

mi sto confuso con la parte gamma. come io ho appena fatto questo

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

voglio usarlo per testare le mie carte – karto

+4

@FlorinStingaciu, Perché non si vuole fare questo? – Pacerier

+1

possibile duplicato di [Inserisci/Aggiorna data casuale in MySQL] (http://stackoverflow.com/questions/4546111/insert-update-random-date-in-mysql) –

risposta

43

Ecco un esempio che dovrebbe aiutare:

INSERT INTO `sometable` VALUES(
    FROM_UNIXTIME(
     UNIX_TIMESTAMP('2010-04-30 14:53:27') + FLOOR(0 + (RAND() * 63072000)) 
    ) 
) 

Esso utilizza la data 2010-04-30 14:53:27 come la base, converte che a un timestamp Unix, e aggiunge un numero casuale di secondi da 0 a +2 anni alla data base e la converte in DATETIME.

Dovrebbe essere abbastanza vicino ma per periodi di tempo più lunghi bisestili e altri aggiustamenti lo elimineranno.

+0

prova ora. Grazie mille – karto

+0

@karto, Per la gestione degli anni bisestili, vedere la mia soluzione http://stackoverflow.com/a/28944156/632951 – Pacerier

+0

Non funziona se sono necessarie date precedenti al 1/1/1970. –

18

Questo dovrebbe funzionare bene:

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 viene utilizzato per determinare il numero di secondi nell'intervallo di date. Moltiplicalo per un numero casuale compreso tra 0 e 1, in un numero casuale compreso tra 0 e il numero di secondi dell'intervallo. L'aggiunta di questo numero casuale di secondi al limite inferiore dell'intervallo genera una data casuale tra i limiti dell'intervallo di dati.

5

modo più semplice fuori:

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

Questo funziona perfettamente anche per gli anni bisestili:

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

L'idea è semplice: Basta prendere un timestamp casuale tra i due timestamp, quindi convertirlo a datetime utilizzando from_unixtime. In questo modo è possibile garantire che ogni opzione abbia uguale probabilità.

4

Basta provare:

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

E 'un vecchio thread, ma ancora .. Nel mio caso ho bisogno per generare data casuale in formato simile a questo: 2017/01/01. Se qualcuno ne avesse bisogno, ho usato la soluzione @ drew010 e la data formattata con DATE_FORMAT.

Ecco il mio codice:

SELECT DATE_FORMAT(FROM_UNIXTIME(UNIX_TIMESTAMP('2015-01-01') + FLOOR(0 + (RAND() * 63072000))), '%Y-%m-%d');