Открыть сервис

Тип данных DURATION

DURATION — это тип данных, предназначенный для хранения и представления промежутков времени (интервалов, длительностей, временных отрезков). В отличие от типов данных, предназначенных для хранения момента во времени (дата, время, метка времени), DURATION фиксирует не точку на временной оси, а разницу между двумя такими точками. Данный тип данных используется в различных системах управления базами данных (СУБД), языках программирования и форматах обмена данными для моделирования временных интервалов, продолжительности процессов, периодов действия и других величин, измеряемых в единицах времени.

Определение и ключевые характеристики

Тип данных DURATION (также может называться INTERVAL, TIME SPAN, PERIOD или DURATION) представляет собой значение, выражающее количество времени между двумя событиями. Основные характеристики:

  • Измерение в единицах времени: Значение DURATION всегда выражается в определённых единицах (секунды, минуты, часы, дни, месяцы, годы) или их комбинации.
  • Отсутствие привязки к календарю: В отличие от типа DATE или TIMESTAMP, DURATION не имеет фиксированной точки отсчёта. Например, значение «2 дня» не указывает, какие именно дни (понедельник или вторник) имеются в виду.
  • Арифметические операции: DURATION поддерживает сложение, вычитание, умножение на число и деление на число. Основные операции:
  • TIMESTAMP + DURATION = TIMESTAMP (прибавление интервала к моменту времени даёт новый момент времени).
  • TIMESTAMP - TIMESTAMP = DURATION (вычитание двух моментов времени даёт интервал).
  • DURATION + DURATION = DURATION.
  • DURATION * N = DURATION.
  • Сравнение: Значения DURATION можно сравнивать между собой (больше, меньше, равно).

История и происхождение

Концепция хранения интервалов времени возникла с развитием реляционных баз данных и языков программирования в 1970-х — 1980-х годах. В стандарте SQL (Structured Query Language) впервые тип данных INTERVAL был определён в стандарте SQL:1992 (SQL-92). До этого разработчики были вынуждены хранить временные интервалы в виде чисел (например, количество секунд) или строк, что усложняло вычисления и повышало риск ошибок.

Введение стандартизированного типа INTERVAL позволило:

  • Упростить арифметику с датами и временем.
  • Обеспечить переносимость кода между различными СУБД.
  • Улучшить читаемость и надёжность запросов.

В языках программирования, таких как Java (класс Duration в пакете java.time), Python (объект timedelta в модуле datetime) и C# (структура TimeSpan), аналогичные типы появились в конце 1990-х — начале 2000-х годов, став частью стандартных библиотек.

Классификация и виды

Тип DURATION можно классифицировать по двум основным признакам: по точности и по способу представления.

По точности (дискретности)

  1. Фиксированная точность (Fixed Precision): Интервал выражается в одной единице измерения (например, только в секундах, только в днях). Это наиболее распространённый и простой в реализации тип. Пример: DURATION(1000) может означать 1000 секунд.
  2. Составная точность (Compound Precision): Интервал выражается в нескольких единицах измерения одновременно. Например, 1 год 2 месяца 3 дня 4 часа 5 минут 6 секунд. Такой подход более нагляден для человека, но сложнее в арифметических вычислениях из-за непостоянной длины месяцев и лет.

По способу представления

  1. Год-месяц (Year-Month Interval): Представляет интервалы, измеряемые в годах и месяцах. Важная особенность — этот тип не учитывает дни, часы, минуты и секунды. Он используется для периодов, где точная длина месяца не имеет значения (например, срок действия договора — 1 год).
  2. День-время (Day-Time Interval): Представляет интервалы, измеряемые в днях, часах, минутах, секундах и долях секунды. Этот тип является более точным, так как длина дня фиксирована (24 часа), а длина часа — 60 минут и т.д. Он используется для измерения продолжительности процессов, временных задержек и т.п.

Применение

Тип данных DURATION широко применяется в различных областях информационных технологий.

В системах управления базами данных (СУБД)

В SQL стандарт INTERVAL реализован в большинстве реляционных СУБД (PostgreSQL, Oracle, MySQL, Microsoft SQL Server — с ограничениями). Примеры использования:

  • Расчёт сроков: SELECT order_date + INTERVAL '30 days' AS delivery_date FROM orders;
  • Вычисление возраста: SELECT CURRENT_DATE - birth_date AS age_in_days FROM employees;
  • Анализ временных рядов: SELECT event_time, event_time - LAG(event_time) OVER (ORDER BY event_time) AS time_since_last_event FROM events;
  • Хранение периодов действия: В таблицах с данными о подписках, контрактах или тарифах.

В языках программирования

  • Java (java.time.Duration): Используется для представления количества времени в секундах и наносекундах. Поддерживает арифметику, сравнение и преобразование в другие единицы.
  • Python (datetime.timedelta): Представляет разницу между двумя объектами datetime. Поддерживает арифметику и сравнение.
  • C# (System.TimeSpan): Представляет временной интервал. Поддерживает арифметику, сравнение и форматирование.
  • JavaScript (встроенный объект Date не имеет отдельного типа Duration): Для работы с интервалами используются библиотеки, такие как moment.js или встроенный Intl.DurationFormat (экспериментальный).

В форматах обмена данными

  • ISO 8601: Международный стандарт, определяющий формат представления дат и времени. Для интервалов используется формат PnYnMnDTnHnMnS (например, P1Y2M3DT4H5M6S — 1 год, 2 месяца, 3 дня, 4 часа, 5 минут, 6 секунд). Этот формат широко применяется в XML, JSON, YAML и других форматах.
  • Protocol Buffers (protobuf): Тип google.protobuf.Duration используется для представления интервалов времени в формате protobuf.

Примеры

  1. SQL (PostgreSQL):

```sql -- Создание таблицы с интервалом CREATE TABLE tasks ( id SERIAL PRIMARY KEY, task_name TEXT, estimated_time INTERVAL );

-- Вставка данных INSERT INTO tasks (task_name, estimated_time) VALUES ('Написать отчёт', '2 hours 30 minutes'), ('Проверить код', '45 minutes');

-- Вычисление общего времени SELECT SUM(estimated_time) AS total_time FROM tasks; ```

  1. Python:

```python from datetime import datetime, timedelta

Создание интервала

duration = timedelta(days=5, hours=3, minutes=15)

Арифметика

now = datetime.now() future = now + duration print(future)

Разница между двумя моментами

start = datetime(2023, 1, 1, 10, 0, 0) end = datetime(2023, 1, 1, 12, 30, 0) diff = end - start print(diff) # 2:30:00 ```

  1. ISO 8601:
  • P1Y — 1 год.
  • P2M — 2 месяца.
  • P3D — 3 дня.
  • PT4H5M6S — 4 часа, 5 минут, 6 секунд.
  • P1Y2M3DT4H5M6S — 1 год, 2 месяца, 3 дня, 4 часа, 5 минут, 6 секунд.

Интересные факты

  • Тип INTERVAL в SQL может быть как положительным, так и отрицательным. Отрицательный интервал означает, что одно событие произошло раньше другого.
  • В некоторых СУБД (например, в Oracle) существует тип данных INTERVAL YEAR TO MONTH и INTERVAL DAY TO SECOND, которые являются строгими реализациями год-месяц и день-время интервалов.
  • В стандарте SQL:2016 появился тип PERIOD, который представляет собой не просто интервал, а отрезок времени с началом и концом. Он позволяет выполнять операции над временными отрезками, такие как пересечение, объединение и разность.
  • В языках программирования с динамической типизацией (например, JavaScript) работа с интервалами часто требует использования сторонних библиотек, так как встроенные средства не предоставляют отдельного типа для длительности.

Источники

  1. ISO/IEC 9075-1:2016, Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework).
  2. ISO 8601-1:2019, Date and time — Representations for information interchange — Part 1: Basic rules.
  3. Документация PostgreSQL: Глава 8. Типы данных. Раздел 8.5. Типы даты/времени.
  4. Документация Java 8: Класс java.time.Duration.
  5. Документация Python 3: Модуль datetime. Класс timedelta.
  6. Документация Microsoft .NET: Структура System.TimeSpan.

BFOmetr — база данных и аналитика по компаниям России.

На главную BFOmetr →