#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
чтобы получить количество действительных дней между этими датами.