Есть ли способ подсчитывать дни ВНУТРИ диапазона дат?

#date #ms-access #count #days

#Дата #ms-access #подсчитывать #дни

Вопрос:

Я совсем новичок в VB / SQL, я начал свое обучение всего несколько месяцев назад, но я могу понять логику алгоритмов, поскольку я использовал некоторые Excel VBA.

На самом деле я разрабатываю базу данных, в которой я могу (желаю) отслеживать деятельность каждого коллеги в течение года.

Цель состоит в том, чтобы иметь (ежемесячное) соотношение => Оплачиваемые дни / (Оплачиваемый Не оплачиваемый — Отсутствует)

Контекст: Один человек может быть: работающим внутри компании (не оплачиваемым), ИЛИ работающим внешне (оплачиваемым), ИЛИ в праздничные дни (отсутствующим).

  • У меня есть таблица [Планирование], где хранятся следующие данные: [Идентификатор консультанта] (связан с другой таблицей [Консультант], [Активность] (Список с тремя вариантами, описанными выше), [Начальная дата], [Конечная дата].

Пример : Консультант 1: Работал внешне с 01/01/2019 по 01/06/2019, работал внутри компании с 02/06/2019 по 31/12/2019, праздники с 02/03/2019 по 15/03/2019

Есть ли способ получить коэффициент оплаты за март, например?

Я создал 4 запроса (может быть, слишком много?) 3 запроса: [Consultant_ID] [Activity] [Beginning_Date] [End_Date] [Соотношение: Datediff(«d»;[Beginning_Date];[End_Date]).

Для каждого запроса: [Критерии активности]: один работает внутри, один работает снаружи, один отсутствует.

И для критериев [Beginning_Date] и [End_Date]: <=[Введите дату начала], >=[Введите дату окончания]

И 4-й запрос [Идентификатор консультанта] [Оплачиваемый] [Не оплачиваемый] [Отсутствует] (и планируется добавить [СООТНОШЕНИЕ]).

Проблема в том, что Datediff подсчитывает даты всей активности того, что он находит, а не только даты между 01/03/2019 и 31/03/2019, как я хотел.

Я ожидаю, что результатом соотношения будет: Оплачиваемые дни / (Оплачиваемые Не оплачиваемые — Отсутствуют) желаемого периода.

Фактический результат показывает оплачиваемые, неоплачиваемые и отсутствующие дни за весь период между введенными датами

Таким образом, вместо 31 оплачиваемого, 0 не оплачиваемых, 15 отсутствуют, отображается 180 оплачиваемых, 0 не оплачиваемых, 32 отсутствуют

Извините за длинный пост, на самом деле это мой первый, и большое вам спасибо! Я боролся с этим целую неделю

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

1. Очень длинный и очень широкий вопрос. Ответ «Вероятно». Проблема в том, что критерии даты не распознаны?

2. Пожалуйста, поделитесь с нами фактическим sql запроса 1 для внутренней работы и запроса 4. В противном случае мы просто гадаем и стреляем в темноте, что рекомендовать.

3. @June7 Это распознается, но datediff занимает всю продолжительность, в то время как я хочу рассчитать соотношение только для определенного месяца или недели, например

Ответ №1:

Сначала нам нужно определить даты maxBegin и minEnd для каждой строки

  SELECT
       *,
        (IIF (Beginning_Date > #3/1/2019#, Beginning_Date, #3/1/2019#)   ) as maxBegin,
        (IIF (End_Date < #3/31/2019#, End_Date, #3/31/2019#)   ) as minEnd,
        Datediff("d", maxBegin, minEnd)   1 as theDiff
     FROM Planning
     Where Beginning_Date <= #3/31/2019#  AND End_Date >= #3/1/2019#
  

Затем используйте это для вычисления длительностей. Примечание: DateDiff не учитывает оба конца, поэтому нам нужно добавить 1.

 SELECT
   Consultant_ID,
   SUM(IIF (Activity = "Working Internally", Datediff("d", maxBegin, minEnd)  1, 0) ) as NonBillable,
   SUM(IIF (Activity = "Working Externally", Datediff("d", maxBegin, minEnd)  1, 0) ) as Billable,
   SUM(IIF (Activity = "Holidays", Datediff("d", maxBegin, minEnd)  1, 0) ) as Absent
FROM
   (
     SELECT
       *,
        (IIF (Beginning_Date > #3/1/2019#, Beginning_Date, #3/1/2019#)   ) as maxBegin,
        (IIF (End_Date < #3/31/2019#, End_Date, #3/31/2019#)   ) as minEnd
     FROM Planning
     Where Beginning_Date <= #3/31/2019#  AND End_Date >= #3/1/2019#
   ) as z

GROUP BY Planning.Consultant_ID;
  

Наконец, вам нужно подставить фактические даты начала / окончания через параметры в sql для выполнения вашего запроса. Также обратите внимание, что праздников всего 14, а не 15.

Кроме того, вы можете добавить вычисление коэффициента прямо в этот sql и выполнить только один запрос.

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

1. Я только что попробовал ваш код, он отлично работает с небольшими изменениями (в именах некоторых элементов, связанных с моей базой данных) Большое вам спасибо за ваш ответ, он очень понятен даже для такого новичка, как я!