2012-08-10 148 views
26

Con SQL, ¿Puedo insertar valores aleatorios de fecha y hora en una columna que proporcione un rango?Mysql insertar fecha y hora aleatorias en un rango de fecha y hora dado

Por ejemplo, dada una serie de 2010-04-30 14:53:27-2012-04-30 14:53:27

Me estoy confundido con la parte rango. como yo quiero que acabamos de hacer esto

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

quiero utilizarlo para probar mis cartas – karto

+4

@FlorinStingaciu, ¿por qué no quieren hacer esto? – Pacerier

+1

posible duplicado de [Insertar/Actualizar fecha aleatoria en MySQL] (http://stackoverflow.com/questions/4546111/insert-update-random-date-in-mysql) –

Respuesta

43

Aquí hay un ejemplo que debería ayudar:

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

Utiliza la fecha 2010-04-30 14:53:27 como la base, convierte eso a una marca de tiempo Unix, y añade un número al azar de segundos de 0 a +2 años a la fecha base y lo convierte a DATETIME.

Debe estar muy cerca, pero en períodos de tiempo más largos los años bisiestos y otros ajustes lo arrojarán.

+0

intentándolo ahora. muchas gracias – karto

+0

@karto, para manejar años bisiestos, ver mi solución http://stackoverflow.com/a/28944156/632951 – Pacerier

+0

No funciona si necesita fechas anteriores al 1/1/1970. –

18

Esto debería funcionar bien:

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 se utiliza para determinar el número de segundos en el intervalo de fechas. Multiplique esto por un número aleatorio entre 0-1 resultados en un número aleatorio entre 0 y la cantidad de segundos en el rango. Agregar este número aleatorio de segundos al límite inferior del rango da como resultado una fecha aleatoria entre los límites del rango de datos.

5

salida más fácil:

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

Esto funciona perfectamente incluso para los años bisiestos:

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

La idea es simple: Basta con echar una marca de tiempo aleatorio entre las dos marcas de tiempo, y luego convertirlo a datetime usando from_unixtime. De esta forma, puedes asegurarte de que cada opción tenga la misma probabilidad.

4

sólo trato:

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

Es un hilo viejo, pero todavía .. En mi caso necesario para generar fecha aleatoria en formato de esta manera: 01.01.2017. Si alguien lo necesita, he usado la solución @ drew010 y la fecha formateada con DATE_FORMAT.

Aquí está mi código:

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