Это должно быть допустимо для SQL Server и должно быть безопасным для интернационализации (примечание: у меня нет есть сервер для проверки этого).
SELECT datediff(day, @start, @end) - datediff(week, @start, @end) * 2
- CASE WHEN datepart(weekday, @start)
IN (datepart(weekday, '1970-01-03'),
datepart(weekday, '1970-01-04'))
THEN 1
ELSE 0 END,
- CASE WHEN datepart(weekday, @end)
IN (datepart(weekday, '1970-01-03'),
datepart(weekday, '1970-01-04'))
THEN 1
ELSE 0 END
Дай вихрь.
Учитывая пояснение, здесь должно быть указано число каждого дня.
Не использует рекурсию и должно быть полностью международным.При необходимости вам придется скорректировать параметры даты начала / окончания для включения / исключения (версия DB2, которую я использовал для проверки, исключала дату начала, но включала, например, дату окончания).
WITH dayOfWeek (name, dayNumber) as (VALUES(dayname(weekday, '1970-01-01'), daypart(weekday, '1970-01-01')),
(dayname(weekday, '1970-01-02'), daypart(weekday, '1970-01-02')),
(dayname(weekday, '1970-01-03'), daypart(weekday, '1970-01-03')),
(dayname(weekday, '1970-01-04'), daypart(weekday, '1970-01-04')),
(dayname(weekday, '1970-01-05'), daypart(weekday, '1970-01-05')),
(dayname(weekday, '1970-01-06'), daypart(weekday, '1970-01-06')),
(dayname(weekday, '1970-01-07'), daypart(weekday, '1970-01-07')))
SELECT name, dayNumber, datediff(weeks, @start, @end)
+ CASE WHEN datepart(weekday, @end) >= dayNumber THEN 1 ELSE 0 END
- CASE WHEN datepart(weekday, @start) >= dayNumber THEN 1 ELSE 0 END
FROM dayOfWeek
Это помогает?