Как в Power Query рассчитать общее время, отработанное за несколько дней, на основе графика рабочих смен и без учета выходных?

Привет, мир переполнения стека. Спасибо за внимание. У меня есть 2 таблицы со следующими данными в Power Query, показанными ниже.

Таблица 1: График смен

День Раннее время начала Раннее окончание времени Позднее время начала Позднее время окончания Общее количество рабочих часов Пн. 07:30:00 15:15:00 15:10:00 22:10:00 14,67 Вт 07:30:00 15:15:00 15:10:00 22:10:00 14,67 Обвенчались 07:30:00 15:15:00 15:10:00 22:10:00 14,67 Чт 07:30:00 15:15:00 15:10:00 22:10:00 14,67 Пт 07:00:00 13:00:00 12:55:00 18:55:00 11.92

Таблица 2: Рабочие процессы

Процесс Дата и время начала Начало дня Дата и время окончания Конец дня Продолжительность процесса Часы (ожидаемый результат) 1 03 июня 2024 г. 10:30:00 Пн. 07-июнь-2024 18:25:00 Пт 67.10 2 04-июнь-2024 11:00:00 Вт 11 июня 2024 г. 10:00:00 Вт 69,60 3 05 июня 2024 11:55:00 Обвенчались 05 июня 2024 22:10:00 Обвенчались 10.25 4 06 июня 2024 г. 14:00:00 Чт 06-июнь-2024 14:00:01 Чт 0,00028 5 01.11.2021 23:38:59 Пн. 02.11.2021 00:35:51 Вт 0,95

Мне нужна формула Power Query, которая рассчитывает продолжительность процесса в таблице 2, которая учитывает часы смены из таблицы 1 и сверхурочную работу. В выходные и праздничные дни смены и сверхурочные работы отсутствуют. Например, в Таблице 2:

  1. Процесс 1: Продолжительность = часы, затраченные на процесс в рабочее время с понедельника 3 июня по пятницу 7 июня. = часы понедельника (с 10:30:00 до 22:10:00) 11.67 + часы вторника (полный день) 14.67 + часы среды (полный день) 14.67 + часы четверга (полный день) 14.67 + часы пятницы (07:00:00) до 17:40:00) 11.42 = 67,10 часов

  2. Процесс 2: Продолжительность = часы, потраченные на процесс в рабочее время со вторника 4 июня по вторник 11 июня. = часы вторника (с 11:00:00 до 22:10:00) 11.17 + часы среды (полный день) 14.67 + часы четверга (полный день) 14.67 + часы пятницы (полный день) 11.92 + часы понедельника (полный день) 14.67 + Вт (с 07:30:00 до 10:00:00) 2.50. = 69,60 часов

  3. Процесс 3: Продолжительность = часы, потраченные на процесс в рабочее время со среды 5 июня по июнь. = (с 11:55:00 до 22:10:00) = 10,25 часов

  4. Процесс 4: Продолжительность = часы, потраченные на процесс в рабочее время с четверга 6 июня по июнь. = (с 14:00:00 до 14:00:01) = 0,00028 часов

  5. Процесс 5: Продолжительность = часы, потраченные на процесс в сверхурочное время (вне смены) с понедельника 1 ноября по вторник 02 ноября. = (с 23:38:59 до 00:35:51) = 0,95 часа

(Все значения выше округлены для простоты)

Я пытался жестко запрограммировать его и использовал различные операторы if/else, но ничто не дает нужных мне точных и повторяемых результатов, независимо от того, какие входные данные содержатся в таблице 2. Предполагается, что формат данных всегда будет правильным, а значения NULL не допускаются.

Любая помощь будет безмерно оценена! Благодарю вас <3

Анализируя ваши ожидаемые результаты, выясняется, что вы дважды считаете пять (5) минут времени, отработанного между Late Start Time и Early End Time, если что-то работало в течение этого времени. Это ваше намерение?

Ron Rosenfeld 10.07.2024 02:45

Нет, это не входит в мои намерения, 5-минутное совпадение не должно учитываться дважды. Спасибо, что указали на это!

Mr Tea 10.07.2024 18:54
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Код Powerquery для таблицы рабочих процессов

let Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
#"Changed Type" = Table.TransformColumnTypes(Source,{{"Process", Int64.Type}, {"Start DateTime", type datetime}, {"Start Day", type text}, {"End DateTime", type datetime}, {"End Day", type text}}),
#"Added Custom" = Table.AddColumn(#"Changed Type", "date", each {Number.IntegerDivide(Number.From([Start DateTime]),1)..Number.IntegerDivide(Number.From([End DateTime]),1)}),
#"Expanded Custom" = Table.ExpandListColumn(#"Added Custom", "date"),
#"Changed Type1" = Table.TransformColumnTypes(#"Expanded Custom",{{"date", type date}}),
#"Added Custom1" = Table.AddColumn(#"Changed Type1", "day", each Text.Start(Date.DayOfWeekName([date], "en-US"),3),type text),
#"Merged Queries" = Table.NestedJoin(#"Added Custom1", {"day"}, #"Shift Patterns", {"Day"}, "Table2", JoinKind.LeftOuter),
#"Expanded Table2" = Table.ExpandTableColumn(#"Merged Queries", "Table2", {"Early Start Time", "Late End Time", "Total Work Hours"}, {"Early Start Time", "Late End Time", "Total Work Hours"}),
#"Filtered Rows" = Table.SelectRows(#"Expanded Table2", each ([Early Start Time] <> null)),
#"Added Custom2" = Table.AddColumn(#"Filtered Rows", "duration", each 
    if Time.From([Start DateTime]) > Time.From ([Late End Time]) and Number.IntegerDivide(Number.From([Start DateTime]),1) = Number.IntegerDivide(Number.From([date]),1)  // start after end time -- you are working overtime
    then Duration.TotalHours(#time(23,59,59)-Time.From([Start DateTime])) else 
    if Time.From([End DateTime]) < Time.From ([Early Start Time])  // start before start  time -- you are working overtime
    then Duration.TotalHours(Time.From([End DateTime])-#time(0,0,0)) else 
    if Number.IntegerDivide(Number.From([Start DateTime]),1) = Number.IntegerDivide(Number.From([End DateTime]),1)  // end date = start date
    then Duration.TotalHours(Time.From(Time.From([End DateTime]))-Time.From([Start DateTime])) else 
    if Number.IntegerDivide(Number.From([End DateTime]),1) = Number.IntegerDivide(Number.From([date]),1)  // last date of multiple dates
    then Duration.TotalHours(Time.From(Time.From([End DateTime]))-Time.From([Early Start Time])) else 
    if Number.IntegerDivide(Number.From([Start DateTime]),1) = Number.IntegerDivide(Number.From([date]),1)  // first date of multiple dates
    then Duration.TotalHours(Time.From(Time.From([Late End Time]))-Time.From([Start DateTime])) else 
    [Total Work Hours]),
#"Grouped Rows" = Table.Group(#"Added Custom2", {"Process", "Start DateTime", "Start Day", "End DateTime", "End Day"}, {{"duration", each List.Sum([duration]), type number}})
in  #"Grouped Rows"

Моя математика времени неверна, вы правы! Извините за путаницу. Спасибо вам за публикацию. Я попробовал ваш запрос, но, похоже, он возвращает неправильные значения, если фактическая продолжительность процесса очень мала, например в секундах. Например, если Start DateTime = 21 октября 2021 г. 10:37:37, End DateTime = 21 октября 2021 г. 10:37:38, результат Duration возвращает 11,53975194. Правильная длительность — 0,000277 (1 секунда в часах).

Mr Tea 10.07.2024 19:05

Большое спасибо! Я отредактировал свой первоначальный вопрос, чтобы исправить ошибки, на которые вы любезно указали. Кажется, ваш измененный код работает. Однако если есть экземпляры, когда DateTime начала/окончания процесса выходит за пределы диапазонов в таблице «Схемы смен», выходные данные «Продолжительность» возвращают отрицательные значения. Это ситуации, когда инженеры приступили к работе раньше или оставались дольше, чем ожидалось (сверхурочно), для выполнения задач. Можно ли каким-то образом изменить код, чтобы учесть это?

Mr Tea 10.07.2024 20:22

Например: если Дата и время начала = (Пн) 11.01.2021 23:38:59, Дата и время окончания = (Вт) 11.02.2021 00:35:51; Длительность понедельника = -1,483120278, Длительность вторника = -6,902494444. Ожидаемая общая продолжительность = 0,947777778.

Mr Tea 11.07.2024 16:50

Исходный вопрос теперь изменен, чтобы включить этот сценарий. Спасибо!

Mr Tea 11.07.2024 17:26

Тывм<3 подойдёт!

Mr Tea 15.07.2024 13:49

Другие вопросы по теме