Power BI - добавление / вычитание рабочего времени с помощью DAX

У меня две таблицы.

Календарный стол

Date       Holiday
1/1/2019   Yes
1/2/2019   No
1/3/2019   No
1/4/2019   Yes
1/5/2019   No
1/6/2019   Yes
1/7/2019   No
.
.

Таблица данных

 Request #   CreatedDateTime           ClosedDateTime
    A1          1/2/2019 7:15:00 AM    1/4/2019 7:15:00 AM
    A2          1/2/2019 5:15:00 AM    1/5/2019 7:15:00 AM
    A3          1/1/2019 7:45:00 AM    1/6/2019 7:15:00 AM

Часы работы: с 7:00 до 18:00.

Если Запрос создается в нерабочее время, то заявка перемещается на следующий доступный рабочий час. В таблице «Календарь» указаны рабочие и нерабочие дни.

CreatedDateTime_Updated дает ожидаемый результат.

Request #   CreatedDateTime          CreatedDateTime_Updated
A1          1/2/2019 7:15:00 AM      1/2/2019 7:15:00 AM
A2          1/2/2019 5:15:00 AM      1/2/2019 7:00:00 AM
A3          1/1/2019 7:45:00 AM      1/2/2019 7:00:00 AM

Теперь я пытаюсь добавить 33 рабочих часа в этот столбец CreatedDateTime_Updated и назвать это DueDateTime.

Request #   CreatedDateTime_Updated  DueDateTime
A1          1/2/2019 7:15:00 AM      1/7/2019 7:15:00 AM 
A2          1/2/2019 7:00:00 AM      1/5/2019 6:00:00 PM
A3          1/2/2019 7:00:00 AM      1/5/2019 6:00:00 PM

Подобно преобразованию столбца CreateDateTime, ClosedDateTime также необходимо преобразовать. но, с предыдущим рабочим часом, если он закрыт в нерабочее время.

Request #   ClosedDateTime             ClosedDateTime_Updated
    A1      1/4/2019 7:15:00 AM        1/3/2019 6:00:00 PM  
    A2      1/5/2019 7:15:00 AM        1/5/2019 7:15:00 AM
    A3      1/6/2019 7:15:00 AM        1/5/2019 6:00:00 AM

Пожалуйста, объясните это в виде отдельных шагов, чтобы формулу можно было при необходимости скорректировать.

Спасибо.


person CodingDawg    schedule 08.01.2019    source источник


Ответы (1)


Сначала создайте пару вычисляемых столбцов в таблице календаря:

WorkHours = IF('Calendar'[Holiday] = "Yes", 0, 11)

а также

CumulativeHours =
CALCULATE(
    SUM('Calendar'[WorkHours]),
    ALL('Calendar'),
    'Calendar'[Date] <= EARLIER('Calendar'[Date])
)

Я использовал расчетный столбец CreatedDateTime_Updated

CreatedDateTime_Updated =
VAR NextWorkDay =
    CALCULATE (
        MIN ( 'Calendar'[Date] ),
        FILTER ( 'Calendar', 'Calendar'[Date] >= Data[CreatedDateTime].[Date] ),
        'Calendar'[Holiday] = "No"
    )
RETURN
    IF (
        HOUR ( Data[CreatedDateTime] ) < 7
            || NextWorkDay > Data[CreatedDateTime].[Date],
        NextWorkDay + TIME ( 7, 0, 0 ),
        Data[CreatedDateTime]
    )

чтобы создать столбец DueDateTime:

DueDateTime =
VAR CurrentCumulative =
    LOOKUPVALUE (
        'Calendar'[CumulativeHours],
        'Calendar'[Date], Data[CreatedDateTime_Updated].[Date] - 1
    )
VAR HoursIntoDay =
    ROUND (
           24 * ( Data[CreatedDateTime_Updated] - Data[CreatedDateTime_Updated].[Date] )
            - 7,
        2
    )
VAR DueDate =
    CALCULATE (
        MIN ( 'Calendar'[Date] ),
        FILTER (
            'Calendar',
            'Calendar'[CumulativeHours] >= CurrentCumulative + HoursIntoDay + 33
        )
    )
RETURN
    IF ( HoursIntoDay > 0, DueDate + ( 7 + HoursIntoDay ) / 24, DueDate + 18 / 24 )

Я постараюсь объяснить подробности, когда у меня будет время.

person Alexis Olson    schedule 08.01.2019
comment
Можете ли вы помочь мне решить эту проблему, пожалуйста - stackoverflow.com/questions/66338641/ - person CodingDawg; 24.02.2021