Если вы получите себе calendar table и у вас есть очень простой запрос на руки `
SELECT TOP 1 Date
FROM Calendar
WHERE IsWeekday = 1
AND Date >= @StartDate
AND Date <= @EndDate
ORDER BY NEWID();
Вы всегда могли генерировать даты на лету, хотя:
SET DATEFIRST 1;
DECLARE @Start DATE = '20160207',
@End DATE = '20160214';
WITH Calendar (Date) AS
( SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY N1.N) - 1, @Start)
FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n1 (N)
CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n2 (N)
CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n3 (N)
)
SELECT TOP 1 Date
FROM Calendar
WHERE DATEPART(WEEKDAY, Date) NOT IN (6, 7)
ORDER BY NEWID();
Здесь календарную КТР cross объединяет 3 табличных конструктора для генерации максимум 1000 строк (10 x 10 x 10), а затем ограничивает это количество дней, которое требуется с использованием
TOP (DATEDIFF(DAY, @Start, @End) + 1)
Затем генерирует список дат вперед от начала, используя ROW_NUMBER()
для генерации значений от 1 до n. Таким образом, основным элементом является:
DECLARE @Start DATE = '20160207',
@End DATE = '20160214';
WITH Calendar (Date) AS
( SELECT TOP (DATEDIFF(DAY, @Start, @End) + 1)
DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY N1.N) - 1, @Start)
FROM (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n1 (N)
CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n2 (N)
CROSS JOIN (VALUES (1),(1),(1),(1),(1),(1),(1),(1),(1),(1)) n3 (N)
)
SELECT Date
FROM Calendar
Что дает:
Date
------------
2016-02-07
2016-02-08
2016-02-09
2016-02-10
2016-02-11
2016-02-12
2016-02-13
Это то простой случай удаления уикэнды с WHERE DATEPART(WEEKDAY, Date) NOT IN (6, 7)
и выбора случайного ряда с TOP 1 ... ORDER BY NEWID()
. Как и в стороне, при использовании чего-то чувствительного, например DATEPART(WEEKDAY, ...)
, вы должны всегда явно задали нужное значение, а не полагались на значения по умолчанию.
я, возможно, не понял ваши требования, хотя, этот последний шаг не нужен, если вы просто хотите получить список всех дат
Вы имели в виду список вроде 02/07/2016,02/08/2016 по 02/12/2016, а не 11 и 12? всего 6 строк? – LONG
Да, я это сделал, и это должно быть случайным образом распределено для остальных столбцов, как я упоминал выше. – Sickle