2010-12-05 12 views
7

Estoy intentando generar un gran conjunto de datos que incluye el tipo de datos de tiempo en SQL Server 2008. Ya tengo algunos datos que no son de tiempo en una tabla, así que me gustaría mantener todo el proceso en T-SQL y use un insert-into-select para obtener los datos parciales de una tabla e insertarlos en la siguiente junto con algunos datos generados, incluida la hora.Generar datos aleatorios de prueba de SQL Server 2008

Me gustaría generar un tiempo aleatorio (7) entre dos puntos, por ejemplo, un tiempo aleatorio entre las 8:00 y las 9:00. Encontré algunas publicaciones anteriores a 2008, pero nada sobre el tipo de hora de SQL Server 2008.

+0

generarlo como un número aleatorio de 0 a 59, y lanzarlo a tiempo? – SteveCav

Respuesta

8

Hay 86,400,000 milisegundos en un día, para que pueda obtener un valor de tiempo aleatorio al hacer esto:

select dateadd(millisecond, cast(86400000 * RAND() as int), convert(time, '00:00'))

Para su ejemplo en el que desea veces entre las 8:00 y las 9: 00, hay 3,600,000 milisegundos en una hora, así que modifique la consulta de esta manera.

select dateadd(millisecond, cast(3600000 * RAND() as int), convert(time, '08:00'))

Con el fin de poner dentro de su nueva tabla, es posible que sea hacer un bucle T-SQL con actualizaciones (s l ... ... o ... w ...), o haga un SELECT INTO desde su tabla original en una nueva tabla.

+0

Esto creará un valor aleatorio pero no será capaz de ser utilizado para crear múltiples valores aleatorios en una declaración 'SELECT'. –

+0

Sí, tendrá que colocar sus inserciones en un bucle de T-SQL. ¿Necesitas que cambie mi publicación para incluir la sintaxis? – mattmc3

+0

¡No soy el OP! Solo estaba señalando un beneficio de 'newid()' sobre 'rand()' –

4

Para generar 100 filas de datos de prueba puede usar lo siguiente.

WITH E00(N) AS (SELECT 1 UNION ALL SELECT 1), 
     E02(N) AS (SELECT 1 FROM E00 a, E00 b), 
     E04(N) AS (SELECT 1 FROM E02 a, E02 b), 
     E08(N) AS (SELECT 1 FROM E04 a, E04 b), 
     E16(N) AS (SELECT 1 FROM E08 a, E08 b), 
     E32(N) AS (SELECT 1 FROM E16 a, E16 b) 
SELECT TOP 100 CAST(DATEADD(SECOND,ABS(CHECKSUM(NEWID()))%3600,'08:00') AS TIME) 
FROM E32 
+0

Quizás sea bueno señalar que WITH Exx genera filas ficticias para seleccionar y no es necesario obtener un valor aleatorio. Es una forma bastante inteligente y compacta, pero me llevó algo de tiempo conseguirla. –

+0

¿Qué hay de reemplazar el Exx CON con 'CON X (X) AS (SELECCIONAR 1 UNIÓN TODO SELECCIONAR 1 DE X) SELECCIONAR ... OPCIÓN (MAXRECURSIÓN 100)'? Aparentemente está limitado a 32k filas, pero eso podría no ser un problema. –

+0

@ FrankdeGroot-Schouten - [No es tan eficiente] (http://stackoverflow.com/questions/10819/sql-auxilery-table-of-numbers/2663232#2663232) –

Cuestiones relacionadas