# DatetimeDiff `datetimeDiff` получает количество времени между двумя значениями даты и времени, используя указанную единицу времени. Обратите внимание, что разница рассчитывается в _целых_ единицах (см. пример ниже). | Синтаксис | Пример | |---------------------------------------------------------------------------------------------------------------------| --------------------------------------------------- | | `datetimeDiff(datetime1, datetime2, unit)` | `datetimeDiff("2022-02-01", "2022-03-01", "month")` | | Получает разницу между двумя значениями datetime (datetime2 минус datetime 1), используя указанную единицу времени. | `1` | ## Параметры `datetime1` и `datetime2` могут быть: - Имя столбца метки времени, - пользовательское выражение, которое возвращает [datetime](#accepted-data-types) или - строка в формате `"YYYY-MM-DD"` или `"YYYY-MM-DDTHH:MM:SS"` (как показано в примере выше). `unit` может быть любым из: - "year" - "quarter" - "month" - "week" - "day" - "hour" - "minute" - "second" ## Подсчет возраста Допустим, вы производитель сыра и хотите отслеживать процесс созревания: | Cheese | Aging Start | Aging End | Mature Age (Months) | | ------------- | ---------------- | ---------------- | ------------------- | | Provolone | January 19, 2022 | March 17, 2022 | 1 | | Feta | January 25, 2022 | May 3, 2022 | 3 | | Monterey Jack | January 27, 2022 | October 11, 2022 | 8 | **Возраст зрелости (в месяцах)** – это специальный столбец с выражением: ``` datetimeDiff([Aging Start], [Aging End], "month") ``` Для расчета _текущего_ возраста сыра в месяцах вы используете [`now`](../expressions/now.md) в качестве второго параметра datetime, например: | Cheese | Aging Start | Aging End | Mature Age (Months) | Today | Current Age (Months) | | ------------- | ---------------- | ---------------- | ------------------- | ------------------ | -------------------- | | Provolone | January 19, 2022 | March 17, 2022 | 1 | September 19, 2022 | 8 | | Feta | January 25, 2022 | May 3, 2022 | 3 | September 19, 2022 | 7 | | Monterey Jack | January 27, 2022 | October 11, 2022 | 8 | September 19, 2022 | 7 | ``` datetimeDiff([Aging Start], now, "month") ``` Для расчета текущего возраста сыра в днях вы используете: ``` datetimeDiff([Aging Start], now, "day") ``` ## Допустимые типы данных | [Типы данных](https://www.metabase.com/learn/databases/data-types-overview#Примерs-of-data-types) | Работает с `datetimeDiff` | |---------------------------------------------------------------------------------------------------| ------------------------- | | Строка | ❌ | | Число | ❌ | | Дата Время | ✅ | | Условие | ❌ | | JSON | ❌ | Мы используем «timestamp» и «datetime», чтобы говорить о любом временном типе данных, поддерживаемом GlarusBI. Для дополнительной информации о типах данных в вашей базе данных см. [Руководство по типам данных](../../../data-modeling/expressions/types.md). Если ваши временные метки хранятся в базе данных в виде строк или чисел, администратор может [преобразовать их в временные метки](../../../data-modeling/metadata-editing.md#casting-to-a-specific-data-type) на странице "Метаданные таблиц". ## Ограничения на данный момент `datetimeDiff` недоступен для следующих баз данных: - Druid - Google Analytics ## Связанные функции В этом разделе рассматриваются функции и формулы, которые работают так же, как выражение `datetimeDiff` GlarusBI, с примечаниями о том, как выбрать лучший вариант для вашего случая использования. - [SQL](#sql) - [Таблицы](#spreadsheets) - [Python](#python) ### SQL Когда вы запускаете вопрос с помощью [конструктора запросов](https://www.metabase.com/glossary/query_builder), GlarusBI преобразует ваши графические настройки запроса (фильтры, сводки и т. д.) в запрос и запускает этот запрос. против вашей базы данных, чтобы получить ваши результаты. Если наши [данные образца сыра](#calculating-age) хранятся в базе данных PostgreSQL: ```sql SELECT DATE_PART('month', AGE(aging_end, aging_start)) AS mature_age_months FROM cheese ``` эквивалентно выражению `datetimeDiff` в GlarusBI: ``` datetimeDiff([Aging Start], [Aging End], "month") ``` Некоторые базы данных, такие как Snowflake и BigQuery, поддерживают такие функции, как DATEDIFF или DATE_DIFF. Для получения дополнительной информации ознакомьтесь с нашим списком [общих справочных руководств по SQL](https://www.metabase.com/learn/debugging-sql/sql-Sintaxis#common-sql-reference-guides). ### Таблицы Если наши [данные образца сыра](#calculating-age) находятся в электронной таблице, где «Начало старения» находится в столбце B, а «Конец старения» — в столбце C: ``` DATEDIF(B1, C1, "M") ``` дает такой же результат как и: ``` datetimeDiff([Aging Start], [Aging End], "month") ``` Да, `DATEDIF` выглядит немного неправильно, но функция электронной таблицы на самом деле является `DATEDIF()` с одной буквой "f", а не `DATEDIFF()`. ### Python Предполагая, что [данные образца сыра](#calculating-age) находятся в столбце данных `pandas` с именем `df`, вы можете напрямую вычесть даты и использовать `timedelta64` `numpy`, чтобы преобразовать разницу в месяцы: ``` df['Mature Age (Months)'] = (df['Aging End'] - df['Aging Start']) / np.timedelta64(1, 'M') ``` аналогично: ``` datetimeDiff([Aging Start], [Aging End], "month") ``` ## Дополнительная информация - [Документация по кастомным выражениям](../expressions.md) - [Руководство по кастомным выражениям. Документация Metabase](https://www.metabase.com/learn/questions/custom-expressions) - [Анализ временных серий](https://www.metabase.com/learn/time-series/start)