Как узнать количество рабочих дней между датами в SQL: простой способ
SELECT COUNT(*)
FROM your_table
WHERE your_date_column >= start_date AND your_date_column <= end_date
AND DATEPART(dw, your_date_column) NOT IN (1,7)
Детальный ответ
Как посчитать количество рабочих дней между датами в SQL?
В SQL можно использовать различные методы для подсчета количества рабочих дней между двумя датами. Рабочие дни обычно представляют собой дни, которые не являются выходными или праздничными.
Метод 1: С использованием функции DATEDIFF
Функция DATEDIFF позволяет нам вычислить разницу между двумя датами в SQL. Однако, она не учитывает выходные дни. Чтобы это исправить, мы можем использовать CASE выражение для исключения выходных дней. Каждому дню недели присваивается числовое значение - 1 для воскресенья, 2 для понедельника и так далее. Исключим субботу (числовое значение 7) и воскресенье из вычислений. Вот пример запроса:
SELECT
SUM(CASE
WHEN (DATEPART(dw, DateColumn) + @@DATEFIRST) % 7 NOT IN (0, 1)
THEN 1
ELSE 0
END) AS WorkingDays
FROM
YourTable
WHERE
DateColumn >= '2022-01-01' AND DateColumn <= '2022-12-31'
Метод 2: С использованием таблицы с датами выходных и праздничных дней
Если у вас есть таблица с датами выходных и праздничных дней, мы можем использовать ее для подсчета рабочих дней. Нам нужно будет написать запрос, который исключает выходные дни и праздники из вычислений. Вот пример:
SELECT
COUNT(*) AS WorkingDays
FROM
YourTable
WHERE
DateColumn >= '2022-01-01' AND DateColumn <= '2022-12-31'
AND DateColumn NOT IN (SELECT HolidayDate FROM HolidaysTable)
AND WEEKDAY(DateColumn) NOT IN (5, 6)
Метод 3: С использованием рекурсивного запроса
Если вы используете базу данных, поддерживающую рекурсивные запросы, вы можете использовать их для подсчета рабочих дней между двумя датами. Начинаем с первой даты и рекурсивно увеличиваем ее на один день до тех пор, пока не достигнем второй даты. Затем подсчитываем количество рабочих дней на основе условий, используя функцию WEEKDAY, чтобы определить рабочие и выходные дни.
WITH RecursiveDates AS
(
SELECT
@StartDate AS CurrentDate
UNION ALL
SELECT
DATEADD(DAY, 1, CurrentDate)
FROM
RecursiveDates
WHERE
DATEADD(DAY, 1, CurrentDate) <= @EndDate
)
SELECT
COUNT(*) AS WorkingDays
FROM
RecursiveDates
WHERE
WEEKDAY(CurrentDate) NOT IN (5, 6)
AND NOT EXISTS (SELECT 1 FROM HolidaysTable WHERE HolidayDate = CurrentDate)
Заключение
В SQL можно использовать различные методы для подсчета количества рабочих дней между двумя датами. С помощью функции DATEDIFF и CASE выражения, таблицы с выходными и праздничными днями или рекурсивного запроса, вы можете легко определить количество рабочих дней, исключая выходные и праздники. Выбор метода зависит от вашего конкретного случая и требований.