Поделиться через


Поддержка длительности в Power Query M

Длительность в Power Query M представляет разницу между двумя точками времени, выраженными в днях, часах, минутах и секундах. Вы вычисляете время взаимодействия с клиентом, фильтрацию записей на основе истекшего времени или создание динамической логики на основе времени, длительность необходима для создания надежных и интеллектуальных моделей данных.

В этой статье рассматривается структура, создание и манипуляция длительностью в Power Query M. В ней содержатся практические примеры и советы по общим папкам, которые помогут эффективно использовать длительность в рабочих процессах данных.

Создание длительности

Длительность определяется функцией #duration(<days>, <hours>, <minutes>, <seconds>) . Например, #duration(2, 3, 0, 0) представляет длительность 2 дня и 3 часа. Power Query M предоставляет несколько способов создания длительности в зависимости от контекста и требуемого уровня точности.

Используйте функцию #duration

Самый прямой способ создания длительности — с синтаксисом #duration(<days>, <hours>, <minutes>, <seconds>) . Каждый аргумент должен быть числом, а результатом является значение длительности.

#duration(2, 5, 30, 0) // 2 days, 5 hours, 30 minutes

Эта функция также поддерживает дробные секунды:

#duration(0, 0, 0, 1.75) // 1.75 seconds

Создание длительности из значений даты и времени

Длительность также можно создать, вычитая одно значение даты и времени из другого. Результатом является длительность, представляющая интервал времени между двумя.

let
    Source = 
    {
        #date(2025, 7, 24) - #date(2025, 7, 23),
        // Result: #duration(1, 0, 0, 0)
        #time(12, 0, 0) - #time(11, 30, 30),
        // Result: #duration(0, 0, 29, 30)
        #datetime(2025, 7, 24, 12, 0, 0) - #datetime(2025, 7, 23, 12, 0, 0),
        // Result: #duration(1, 0, 0, 0)
        #datetimezone(2025, 7, 24, 12, 0, 0, 7, 0) - #datetimezone(2025, 7, 23, 10, 30, 0, 4, 0),
        // Result: #duration(0, 22, 30, 0)
        #datetime(2025, 7, 24, 12, 0, 0) - DateTime.From(#date(2025, 7, 23))
        // Result: #duration(1, 12, 0, 0)
    }
in
    Source

Замечание

Вычитание одного типа даты и времени из другого типа даты и времени (например, вычитание date значения из datetime значения) приводит к ошибке. Если необходимо использовать различные типы дат и времени для определения длительности, использования Date.FromDateTime.Fromфункций DateTimeZone.Fromили Time.From функций для явного изменения одного из типов даты и времени.

Преобразование из совместимых значений

Функция Duration.From может преобразовывать совместимые значения в длительности. Дополнительные сведения см. в <a0/>.

Работа с длительностью

После создания длительности в Power Query M его можно управлять различными операциями и функциями. Эти возможности позволяют обеспечить высокую гибкость длительности для логики и вычислений на основе времени.

Арифметические операции

Длительность поддерживает стандартные арифметические операции:

  • Добавление и вычитание: добавление или вычитание длительности в другую или из значений даты и времени.

    let
        Source = {
            #duration(1, 2, 0, 0) + #duration(0, 3, 30, 0),
            // Result: #duration(1, 5, 30, 0)
            #duration(1, 2, 0, 0) - #duration(0, 3, 30, 0),
            // Result: #duration(0, 22, 30, 0)
            #datetime(2025, 7, 24, 12, 0, 0) + #duration(0, 2, 0, 0),
            // Result: #datetime(2025, 7, 24, 14, 0, 0)
            #datetime(2025, 7, 24, 12, 0, 0) - #duration(0, 2, 0, 0),
            // Result: #datetime(2025, 7, 24, 10, 0, 0)
            #time(12, 0, 0) - #duration(0, 3, 30, 0)
            // Result: #time(8, 30, 0)
        }
    in
        Source
    
  • Отрицание: длительность может быть отрицаема, чтобы изменить направление.

    let
        Source = {
            #datetime(2025, 7, 24, 12, 0, 0) + -#duration(0, 2, 0, 0),
            // Result (subtracts two hours): #datetime(2025, 7, 24, 10, 0, 0)
            #datetime(2025, 7, 23, 12, 0, 0) - #datetime(2025, 7, 24, 12, 0, 0)
            // Result: -#duration(1, 0, 0, 0)
        }
    in
        Source
    

Умножение и деление

Длительность может быть умножена или разделена числовыми значениями:

let
    Source = {
        #duration(0, 2, 0, 0) * 2,
        // Result (4 hours): #duration(0, 4, 0, 0)
        #duration(1, 0, 0, 0) / 2
        // Result (12 hours): #duration(0, 12, 0, 0)
    }
in
    Source

Это вычисление полезно для масштабирования длительности или усреднения интервалов времени.

Сравнения

Длительность можно сравнить с помощью стандартных операторов сравнения:

let
    Source = #duration(1, 0, 0, 0) > #duration(0, 23, 59, 59)
        // Result: true
in
    Source

Это позволяет использовать длительность в условной логике, например фильтрацию строк на основе истекшего времени.

Совместимость типов

Длительность совместима со значениями даты и времени в арифметических выражениях, но не взаимозаменяемых с ними. Например, вычитание двух значений даты и времени дает durationзначение, но добавление двух значений даты и времени недопустимо.

let
    Source = 
    {
        #datetime(2025, 7, 24, 12, 0, 0) - #datetime(2025, 7, 23, 12, 0, 0),
        // Result: #duration(1, 0, 0, 0)
        #datetime(2025, 7, 24, 12, 0, 0) + #datetime(2025, 7, 23, 12, 0, 0)
        // Result: Error
    }
in
    Source

Функции длительности в M

Power Query M включает набор встроенных функций для работы с длительностью. Эти функции позволяют преобразовывание, извлечение компонентов и агрегирование значений длительности, что делает их важными инструментами для преобразований на основе времени.

Duration.From(значение)

Функция Duration.From преобразует совместимое значение в длительность. Совместимые значения состоят из числа, интерпретированного как доля дня или текстового представления длительности. Duration.FromText Перейдите к сведениям о текстовых форматах представления.

let
    Source =
    {
        Duration.From(1.5),
        // Result: 1.5 days = #duration(1, 12, 0, 0)
        Duration.From("2.05:55:20.242")
        // Result: #duration(2, 5, 55, 20.242)
    }
in
    Source

Методы доступа к компонентам

Эти функции извлекают определенные части длительности:

  • Duration.Days(<duration>)

    Возвращает количество целых дней в течение длительности.

  • Duration.Hours(<duration>)

    Возвращает количество часов, превышающее целые дни.

  • Duration.Minutes(<duration>)

    Возвращает количество минут, превышающее целые часы.

  • Duration.Seconds(<duration>)

    Возвращает количество секунд за все минуты.

let
    Source = #duration(2, 5, 30, 45),
    TextFormat = Text.Format(
        "Duration = #{0} days, #{1} hours, #{2} minutes, and #{3} seconds.",
        {
            Duration.Days(Source), 
            Duration.Hours(Source), 
            Duration.Minutes(Source), 
            Duration.Seconds(Source)
        }
    )
    // Results: "Duration = 2 days, 5 hours, 30 minutes, and 45 seconds."
in
    TextFormat

Общие функции значений

Эти функции возвращают общее значение длительности в одной единице, включая дробные части:

  • Duration.TotalDays(<duration>)
  • Duration.TotalHours(<duration>)
  • Duration.TotalMinutes(<duration>)
  • Duration.TotalSeconds(<duration>)
let
    Source = 
    {
        Duration.TotalDays(#duration(1, 12, 0, 0)),    // 1.5 days
        Duration.TotalHours(#duration(1, 12, 0, 0)),   // 36 hours
        Duration.TotalMinutes(#duration(1, 12, 0, 0)), // 2160 minutes
        Duration.TotalSeconds(#duration(1, 12, 0, 0))  // 129600 seconds
    }
in
    Source

Нормализация длительности

В большинстве случаев длительность состоит из дней, часов (максимум 23 часа), минут (максимум 59 минут) и секунд (максимум 59,99999999 секунд). Однако в некоторых случаях максимальные значения в параметрах длительности могут превышаться. В этом случае Power Query M автоматически нормализует следующие значения:

  • Переполнение секунд в минутах
  • Время переполнения минут в часах
  • Переполнение часов в дни

Например, предположим, что у вас есть столбец, предоставляющий дату начала и время выполнения процесса. Кроме того, у вас есть столбец, показывающий, сколько времени потребовалось для завершения процесса в секундах. Вы хотите создать третий столбец, показывающий дату и время завершения процесса.

let
    Source = #table(type table[StartTime = datetime, Seconds = Int64.Type],
    {
        {#datetime(2025, 7, 25, 8, 0, 0), 5400},
        {#datetime(2025, 7, 25, 13, 15, 0), 86400},
        {#datetime(2025, 7, 24, 22, 30, 0), 172800}
    }),
    AddSeconds = Table.AddColumn(
        Source, 
        "EndTime", 
        each [StartTime] + #duration(0, 0, 0, [Seconds]), 
        type datetime
    )
in
    AddSeconds

Следующая таблица является результатом этих вычислений.

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

Таким образом, несмотря на то, что у вас было только количество секунд, в течение которого произошел процесс, Power Query M свертит значение длительности в минуты, часы и дни, когда результат вычисляется.

Представление недель, месяцев и лет

Так как длительность основана на фиксированных единицах (дни, часы, минуты, секунды), нет собственной концепции недель, месяцев или лет, которые зависят от длины. duration Тип в Power Query M — это фиксированная структура, которая не учитывает правила календаря. Для точной длительности в течение нескольких месяцев или лет вычитайте одну дату и время из другого вместо использования фиксированных длительности. Этот подход правильно обрабатывает високосные годы, различные длины месяца и летнее время (DST). Однако также обратите внимание, что некоторые действия даты и времени могут отличаться в зависимости от того, выполняется ли запрос локально (в Power Query Desktop) или в Сети (в Power Query Online). Дополнительные сведения см. в локальных, фиксированных и UTC-вариантах текущей даты и времени. Как правило, избегайте использования фиксированной длительности для долгосрочных вычислений.