Рабочие дни между двумя датами в стандартном SQL с использованием таблицы рабочих дней - PullRequest
0 голосов
/ 26 февраля 2019

это длинный путь, но я надеюсь, что один из вас волшебников там поможет мне.

В моей организации есть календарная таблица CalendarDays, которая содержит два столбца, Date и IsBizDay, который является логическим.

Я хотел бы использовать эту таблицу для расчета рабочих дней между другой таблицей Contracts, которая содержит два столбца;StartDate и EndDate.

Мой желаемый вывод будет StartDate, EndDate, BizDaysBetween.

Ответы [ 2 ]

0 голосов
/ 27 февраля 2019

Давайте подставим pk - первичный ключ для Contracts (или уникальное поле или набор полей).Тогда искомый запрос без коррелированных подзапросов:

select C.pk, C.StartDate, C.EndDate,
       Coalesce( Count(d.Date), 0 ) as BizDaysBetween
  from Contracts C
  left outer join CalandarDays d
          on d.Date >= c.StartDate
         and d.Date <  c.EndDate
         and d.IsBizDay
 group by C.pk, C.StartDate, C.EndDate

Почему соединение вместо коррелированного подзапроса?

Цитирование Коррелированная Википедиястатья подзапроса :

В запросе базы данных SQL коррелированный подзапрос (также известный как синхронизированный подзапрос) - это подзапрос (запрос, вложенный в другой запрос), который использует значения из внешнего запроса,Поскольку подзапрос может оцениваться один раз для каждой строки, обрабатываемой внешним запросом, он может быть неэффективным.

Не забудьте создать правильные индексы.Для CalandarDays индекс может быть составлен из (IsBizDay, Date).

Почему осталось объединение и объединение?

Поскольку, возможно, они не являются рабочим днемдиапазон.

0 голосов
/ 26 февраля 2019
select c.StartDate,
       c.EndDate,
       (select count(*)
        from CalandarDays d
        where d.Date >= c.StartDate
          and d.Date <  c.EndDate
          and d.IsBizDay
       ) as BizDaysBetween
from Contracts c
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...