#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. Я только что попробовал ваш код, он отлично работает с небольшими изменениями (в именах некоторых элементов, связанных с моей базой данных) Большое вам спасибо за ваш ответ, он очень понятен даже для такого новичка, как я!