Как мы рассчитываем время выполнения задачи, рабочие часы между двумя датами
Измерение количества рабочих часов между двумя датами с использованием SQL — это одна из тех классических задач, которая звучит просто, но мучает аналитиков с незапамятных времен.
Эта задача возникает в нескольких местах в dbt Labs:
- Расчет времени, необходимого для решения заявки в службу поддержки
- Измерение производительности команды в соответствии с соглашениями об уровне обслуживания (SLA) по времени ответа
Внутри компании мы называем это "время выполнения задачи", и это может быть критически важной точкой данных для команд, работающих с клиентами. К счастью, наши инструменты для расчета времени выполнения задачи немного улучшились с 2006 года.
Тем не менее, вам придется выполнить довольно сложные SQL или dbt-манипуляции, чтобы сделать это правильно, включая:
- Определение, как исключить ночи и выходные из ваших SQL-расчетов
- Учет праздников с использованием пользовательского календаря праздников
- Приспособление к изменениям в расписании рабочих часов
Эта статья предоставит обзор того, как и, что важно, почему рассчитывать время выполнения задачи и как мы используем его здесь, в dbt Labs.
Две стратегии расчета времени выполнения задачи
- Универсальное решение с вложенными макросами
Это решение позволило нам создать однострочный dbt макрос, чтобы учесть большинство распространенных случаев использования времени выполнения задачи, имея серию вложенных макросов за кулисами.
Эта стратегия отлично справляется с учетом ночей, выходных и пользовательских праздников, но не обладает гибкостью для учета изменений в рабочих часах, поэтому мы перешли на второй вариант:
- Индивидуальное и настраиваемое решение с подзапросом
Наш текущий расчет времени выполнения задачи может быть как мощным, так и гибким благодаря использованию конструкции, которую вы редко видите в dbt Labs - [ах] . Используя часовой уровень таблицы дат , вы можете стандартизировать уникальное определение рабочих часов вашей организации по сравнению с нерабочими часами полностью настраиваемым способом.
Вы можете найти пример кода для каждого из этих подходов в примере репозитория.
После того как мы пройдем через механику расчета времени выполнения задачи, мы потратим некоторое время на размышления о том, как и почему использовать эту метрику в ваших отчетах. Время выполнения задачи может быть огромным подспорьем для операционной отчетности, но, как и любая метрика, она имеет свои сильные и слабые стороны с точки зрения отражения реальной бизнес-ценности.
Мы составили серию вопросов, которые вы должны задать себе, чтобы убедиться, что вы оптимизируете время выполнения задачи для решения тех проблем, для которых оно лучше всего подходит.
Универсальное решение: вложенные макросы
Наш первый подход к расчету времени выполнения задачи основывался на связывании серии макросов. В частности, как мы показываем ниже, нам нужен был способ моделирования нерабочего времени, чтобы правильно исключить его из стандартного расчета date_diff
.
Этот подход отлично работает в случае, когда у нас есть стандартное рабочее расписание, но не подходит, когда мы хотим учесть более сложные, реальные приложения.
Предположим, что ваша команда поддержки клиентов всегда работает с понедельника по пятницу, с 8 утра до 8 вечера, и ваше расписание выглядит примерно так:
И предположим, что у вас есть несколько заявок, которые поступают, и ваша команда усердно работает над ними, как всегда:
Наша метрика, учитывающая расписание, должна захватывать только несерое время:
Как мы можем этого добиться? Для любой из этих заявок общая формула для получения нужного нам ответа сводится к вычитанию нерабочего времени из общего количества времени между датами (т.е. обычный datediff
):
Эти блоки нерабочего времени можно разбить на две части: ночное время и выходные. Но как мы можем динамически подсчитать количество ночей или выходных дней? Встречайте макрос для будних дней!