Есть ли способ считать дни ВНУТРИ диапазона дат? - PullRequest
0 голосов
/ 26 марта 2019

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

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

Цель состоит в том, чтобы (месячный) коэффициент => Платные дни / (оплачиваемые + не оплачиваемые - отсутствуют)

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

  • У меня есть таблица [Planning], в которой хранятся следующие данные: [Consultant_ID] (связанный с другой таблицей [Consultant], [Activity] (список с тремя вариантами, описанными выше), [Beginning_Date], [End_Date] .

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

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

Я создал 4 запроса (может быть, слишком много?) 3 запроса: [Consultant_ID] [Activity] [Beginning_Date] [End_Date] [Ratio: 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 Ответ

0 голосов
/ 27 марта 2019

Сначала необходимо выяснить даты 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.

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

...