Вычисление простого числа определенных дней между двумя датами НЕ должно требовать таблицы чисел.Заставить ввод-вывод в простой расчет даты не является хорошей практикой.
Вы можете выполнить простой расчет, вычислив количество недель между двумя датами и скорректировав место падения желаемого дня относительноконечные периоды.
Но я хочу представить другой способ сделать это, который на самом деле позволяет вам указать любой график дней, который вы хотите считать.Например, рассчитать количество суббот и воскресений одновременно так же просто, как и количество понедельников.Я также старался сделать этот запрос полностью независимым от настройки SET DATEFIRST
.
DECLARE
@StartDate date = '2011-10-01',
@EndDate date = '2011-10-31';
WITH A AS (SELECT DayCount = DateDiff(day, @StartDate, @EndDate) + 1),
B AS (
SELECT
DayCount,
WeekCount = DayCount + 6 / 7,
Dow = DateDiff(day, '18991230', @StartDate) % 7 FROM A
)
SELECT
MondayCount =
Len(Replace(Substring(
Replicate('0100000', WeekCount),
Dow, DayCount
), '0', ''))
FROM B;
Хитрость - это строка внутри функции Replicate
.Он кодирует понедельник, помещая 1
во вторую позицию (начиная с воскресенья в качестве первого дня).
Вы можете чувствовать себя оттолкнутым таким решением, как это, - но я играл с этимдо этого и ожидаем, что вам будет очень трудно улучшить его скорость с помощью обычной математики для дат (особенно в части, касающейся возможности расчета за несколько дней одновременно).