Ну, я знаю, что это старый вопрос, но он был связан с более новым, так что ... Вот мои 2 цента:
- Таблицы базы данных по природе не отсортированы.
- В данном году есть только 365 возможных дат, 366, если это високосный год.
- Дублированные данные - признак плохого дизайна.
Исходя из этих предпосылок, я считаю, что в действительности нет необходимости хранить 1000 случайных дат в таблице, когда можно сохранить только соответствующую дату и просто выбрать, сколько строк и в каком порядке вам нужно.
Сначала сохраните данные в таблице. вы можете использовать таблицу Tally для создания соответствующего диапазона дат.
Таблица Tally - это таблица, содержащая последовательность чисел. ради аргумента, давайте предположим, что вы уже создали свою таблицу чисел от 0 до 1 000 000.
Вы можете проверить эту ссылку для лучшего способа ее создания, лично мне нравится этот метод:
-- create the tally table
SELECT TOP 100000 IDENTITY (int ,0, 1) as num
INTO Tally
FROM sys.sysobjects
CROSS JOIN sys.all_columns
Теперь, когда у вас есть таблица Tally, довольно просто создать календарь:
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)
)
Теперь, когда у вас есть календарь и таблица подсчета, довольно просто использовать их обе для получения любого количества записей в любом порядке.
Тысяча случайно упорядоченных дат? нет проблем:
SELECT TOP 1000 caneldarDate
FROM CalendarCTE c
CROSS JOIN Tally t
WHERE t.num < 1000
ORDER BY NEWID()
Полный сценарий, включая создание и удаление таблицы подсчета, занял менее секунды, чтобы выполнить:
-- 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