SQL-запрос для подсчета количества дней, исключая праздники / выходные

#sql

#sql

Вопрос:

У меня есть поле «workDate» и поле «receivedDate» в таблице «tblExceptions». Мне нужно подсчитать количество дней между двумя. Рабочая дата всегда стоит на первом месте — так что, по сути, это вроде как workDate — это «дата начала», а receivedDate — «дата окончания». Однако некоторые исключения усложняют мне задачу:

Во-первых, мне нужно исключить праздники. у меня действительно есть таблица под названием «tblHolidays» с одним полем — holidayDate. У меня есть праздники, сохраненные до следующего года, так что, возможно, я могу включить это в запрос?

Кроме того, больше всего сбивает с толку то, что рабочие даты никогда не могут приходиться на выходные, но полученные даты могут. Итак, мне каким-то образом нужно исключить выходные, когда я подсчитываю, но разрешить выходные, если полученная дата выпадает на субботу или воскресенье. итак, если дата работы — 3 июня 2011 года, а дата получения — 11 июня 2011 года, количество действительных дней будет равно 7, а не 9.

Любая помощь по этому вопросу очень ценится. Спасибо!

Комментарии:

1. Можете ли вы предоставить свою схему или запрос, демонстрирующий то, что вы пробовали до сих пор, чтобы мы могли попытаться решить эту проблему?

Ответ №1:

Что-то вроде этого должно дать вам количество дней с вычетом праздников:

 select
  days = datediff(day, workDate, receivedDate)
  - (select count(*) from tblHolidays where holidayDate >= workDate and holidayDate < receivedDate)
from
  tblExceptions
  

Обратите внимание, что функции даты различаются в разных системах баз данных. Это основано на MS SQL Server, поэтому может потребоваться адаптация, если вы используете какую-либо другую базу данных.

Комментарии:

1. это отлично работает. мне нужно выбрать множество столбцов из основной таблицы данных, и возможность выбора столбца datediff — это очень здорово. Спасибо!

Ответ №2:

Если у вас есть таблица, полная дат, которые нужно включить (не выходные, не праздничные дни и т.д.), И вы знали, когда дата «начала» и дата «окончания», тогда вы можете сделать что-то примерно подобное этому:

 select count(*) from tblIncludedDates where beginDateValue <= dateField and endDateValue >= dateField
  

чтобы получить количество действительных дней между этими датами.