Пример запроса ниже, вот некоторые подробности того, как я его решил.
Использование DATEDIFF(WK, ...)
даст нам количество недель между двумя датами. SQL Server оценивает это как разницу между номерами недель, а не на основе количества дней. Это прекрасно, так как мы можем использовать это, чтобы определить, сколько выходных прошло между датами.
Таким образом, мы можем умножить это значение на 2, чтобы получить количество дней выходных, которые произошли, и вычесть это значение из DATEDIFF(dd, ...)
, чтобы получить количество дней недели.
Это не ведет себя на 100% правильно, когда дата начала или окончания приходится на воскресенье. Поэтому я добавил в некоторых случаях логику в конце вычисления для обработки этих экземпляров.
Вы также можете подумать, должен ли DATEDIFF
быть полностью включенным. например Разница между 9/10 и 9/11 1 день или 2 дня? Если последнее, вам нужно добавить 1 к конечному продукту.
declare @d1 datetime, @d2 datetime
select @d1 = '9/9/2011', @d2 = '9/18/2011'
select datediff(dd, @d1, @d2) - (datediff(wk, @d1, @d2) * 2) -
case when datepart(dw, @d1) = 1 then 1 else 0 end +
case when datepart(dw, @d2) = 1 then 1 else 0 end