Bueno, sé que esto es una cuestión de edad, sino que estaba vinculado a una más reciente así que ... Aquí están mis 2 centavos:
- tablas de bases de datos no están ordenados por naturaleza.
- Solo hay 365 fechas posibles en un año determinado, 366 si se trata de un año bisiesto.
- La duplicación de datos es un signo de diseño deficiente.
Basado en estas premisas, creo que realmente no hay una necesidad real de almacenar 1000 fechas aleatorias en una tabla, cuando es posible almacenar solo la fecha relevante y simplemente seleccionar cuántas filas y en cualquier orden necesitar.
Primero, almacene los datos dentro de la tabla. puede usar un Tally table para crear el intervalo de fechas relevante.
Una tabla Tally es una tabla que contiene una secuencia de números. por el bien de los argumentos, asumamos que ya ha creado su tabla de números de conteo entre 0 y 1,000,000.
You can check this link de la mejor manera de crear uno, personalmente me gusta este método:
-- create the tally table
SELECT TOP 100000 IDENTITY (int ,0, 1) as num
INTO Tally
FROM sys.sysobjects
CROSS JOIN sys.all_columns
Ahora que tiene la tabla de conteo, es bastante simple de crear un calendario:
DECLARE @FromDate datetime = GETDATE(),
@ToDate datetime = DATEADD(YEAR, 1, GETDATE()) -- a year from now in my example
;With CalendarCTE AS
(
SELECT DATEADD(DAY, num, @FromDate) As caneldarDate
FROM Tally
WHERE num < DATEDIFF(DAY, @FromDate, @ToDate)
)
Ahora que ya tener el calendario y la tabla de recuento, es bastante simple usarlos para obtener cualquier cantidad de registros en el orden que desee. ¿Mil fechas ordenadas al azar? no hay problema:
SELECT TOP 1000 caneldarDate
FROM CalendarCTE c
CROSS JOIN Tally t
WHERE t.num < 1000
ORDER BY NEWID()
guión completo, incluyendo crear y eliminar la tabla de conteo tomaron menos de un segundo para ejecutar:
-- create the tally table
SELECT TOP 100000 IDENTITY (int ,0, 1) as num
INTO Tally
FROM sys.sysobjects
CROSS JOIN sys.all_columns
-- crealte the calendar cte:
DECLARE @FromDate datetime = GETDATE(),
@ToDate datetime = DATEADD(YEAR, 1, GETDATE())
;With CalendarCTE AS
(
SELECT DATEADD(DAY, num, @FromDate) As caneldarDate
FROM Tally
WHERE num < DATEDIFF(DAY, @FromDate, @ToDate)
)
-- select a 1000 random dates
SELECT TOP 1000 caneldarDate
FROM CalendarCTE c
CROSS JOIN Tally t
WHERE t.num < 1000
ORDER BY NEWID()
-- cleanup
DROP TABLE Tally
¿Qué versión de SQL Server utiliza? Probé en SQL Server 2012 y obtuve el 'Uso inválido de un operador de efecto secundario' rand 'dentro de una función. –
Gracias @MikaelEriksson, he solucionado la consulta. Saludos. – danihp