Тип данных 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 можно классифицировать по двум основным признакам: по точности и по способу представления.
По точности (дискретности)
- Фиксированная точность (Fixed Precision): Интервал выражается в одной единице измерения (например, только в секундах, только в днях). Это наиболее распространённый и простой в реализации тип. Пример:
DURATION(1000)может означать 1000 секунд. - Составная точность (Compound Precision): Интервал выражается в нескольких единицах измерения одновременно. Например,
1 год 2 месяца 3 дня 4 часа 5 минут 6 секунд. Такой подход более нагляден для человека, но сложнее в арифметических вычислениях из-за непостоянной длины месяцев и лет.
По способу представления
- Год-месяц (Year-Month Interval): Представляет интервалы, измеряемые в годах и месяцах. Важная особенность — этот тип не учитывает дни, часы, минуты и секунды. Он используется для периодов, где точная длина месяца не имеет значения (например, срок действия договора — 1 год).
- День-время (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.
Примеры
- 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; ```
- 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 ```
- 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) работа с интервалами часто требует использования сторонних библиотек, так как встроенные средства не предоставляют отдельного типа для длительности.
Источники
- ISO/IEC 9075-1:2016, Information technology — Database languages — SQL — Part 1: Framework (SQL/Framework).
- ISO 8601-1:2019, Date and time — Representations for information interchange — Part 1: Basic rules.
- Документация PostgreSQL: Глава 8. Типы данных. Раздел 8.5. Типы даты/времени.
- Документация Java 8: Класс java.time.Duration.
- Документация Python 3: Модуль datetime. Класс timedelta.
- Документация Microsoft .NET: Структура System.TimeSpan.
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →