Поиск пересекающихся дат

#sql #date #ms-access #count

#sql #Дата #ms-access #количество

Вопрос:

Может кто-нибудь помочь мне со следующей проблемой. У меня есть таблица MS Access, скажем, с моими сотрудниками, и для каждого из них у меня есть дата начала и окончания их отпуска:

 Name    begin       end
John    1.3.2021.   15.3.2021.
Robert  6.3.2021.   8.3.2021.
Lisa    13.3.2021.  16.3.2021.
John    1.4.2021.   3.4.2021.
Robert  2.4.2021.   2.4.2021.
Lisa    15.5.2021.  23.5.2021.
Lisa    5.6.2021.   15.6.2021.
 

Как получить результат с количеством сотрудников, которые отсутствуют на работе на каждую дату из таблицы (даты, которые включены в интервалы начало-конец). Например:

 1.3.2021. 1     '>>>only John
2.3.2021. 1     '>>>only John
3.3.2021. 1     '>>>only John
4.3.2021. 1     '>>>only John
5.3.2021. 1     '>>>only John
6.3.2021. 2     '>>>John and Robert
7.3.2021. 2     '>>>John and Robert
...
 

Заранее благодарю!

Ответ №1:

Вы можете использовать union для объединения таблиц и связанного подзапроса:

 select dte,
       (select count(*)
        from t
        where d.dte between t.[begin] and t.[end]
       ) as cnt
from (select [begin] as dte
      from t
      union 
      select [end]
      from t
     ) d;
 

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

1. Спасибо! Это было быстро :). Это кажется очень близким к решению, но не все даты указаны в результате. Например, я получаю результат для 1.3.2021. а следующий — для 6.3.2021.

2. @Mario . , , В вашем вопросе говорится: «на каждую дату из таблицы». Если вам нужны промежуточные даты, вам также понадобится таблица календаря.

3. Здравствуйте, я меняю только даты, которые определяются интервалами (начало-конец), как в моем примере. результат. Могут ли эти даты каким-либо образом извлекаться из этих интервалов вместо таблицы календаря? Я ценю вашу помощь.

4. @Mario . , , на самом деле не в MS Access. Вам нужна таблица календаря.

5. ОК. Я создал таблицу календаря и скорректировал последнюю часть вашего sql-оператора, и это работает — так что большое вам спасибо!