21.7. Функции для работы с типами данных времени #

time_bucket(bucket_width INTERVAL, timestamp_col TIMESTAMP, origin TIMESTAMP) returns TIMESTAMP #

Группирует временные метки в интервалы для анализа временных рядов. Эта функция совместима с функцией time_bucket в TimescaleDB, что упрощает миграцию и обеспечивает совместимость.

Пример 21.22.

-- Группировать события по часам
SELECT time_bucket(INTERVAL '1 hour', created_at) as hour_bucket, COUNT(*)
FROM events
GROUP BY hour_bucket
ORDER BY hour_bucket;

-- Группировать с интервалом 15 минут
SELECT time_bucket(INTERVAL '15 minutes', timestamp_col), AVG(value)
FROM sensor_data
WHERE timestamp_col >= '2024-01-01'
GROUP BY 1
ORDER BY 1;

Обязательные параметры:

Имя

Тип

Описание

bucket_width

interval

Интервал времени для группировки (например, '1 hour', '15 minutes')

timestamp_col

timestamp

Столбец с временными метками для группировки

Необязательные параметры:

Имя

Тип

Описание

origin

timestamp

Точка отсчёта для группировки. Интервалы выровнены относительно этой временной метки.

strftime (timestamp_expr, format_string) returns TEXT #

Форматирует временные метки в виде строк с использованием стандартных кодов форматирования. Эта функция обеспечивает гибкое форматирование временных меток для отображения и экспорта.

Пример 21.23.

-- Форматировать текущую временную метку
SELECT strftime(NOW(), '%Y-%m-%d %H:%M:%S') AS formatted_time;

-- Форматировать временные метки в разных форматах
SELECT
    order_id,
    strftime(created_at, '%Y-%m-%d') AS order_date,
    strftime(created_at, '%H:%M') AS order_time,
    strftime(created_at, '%A, %B %d, %Y') AS readable_date
FROM orders;

-- Использовать для секционирования экспорта в файлы
COPY (SELECT * FROM events WHERE event_date = '2024-01-01')
TO 's3://bucket/events/' || strftime('2024-01-01'::timestamp, '%Y/%m/%d') || '/events.parquet';

Основные коды форматирования:

  • %Y: четырёхзначный год (2024).

  • %m: месяц в числовом формате (01-12).

  • %d: день месяца (01-31).

  • %H: час (00-23).

  • %M: минута (00-59).

  • %S: секунда (00-59).

  • %A: полное название дня недели (понедельник).

  • %B: полное название месяца (январь).

Необязательные параметры:

Имя

Тип

Описание

timestamp_expr

timestamp

Значение временной метки для форматирования

format_string

text

Строка с кодами форматирования

strptime(string_expr, format_string) returns TIMESTAMP #

Преобразует строки во временные метки с помощью кодов форматирования.

Пример 21.24.

-- Разобрать строки с датами
SELECT strptime('2024-01-15 14:30:00', '%Y-%m-%d %H:%M:%S') AS parsed_timestamp;

-- Разобрать разные форматы
SELECT
    strptime('Jan 15, 2024', '%b %d, %Y') AS date1,
    strptime('15/01/2024', '%d/%m/%Y') AS date2,
    strptime('2024-01-15T14:30:00Z', '%Y-%m-%dT%H:%M:%SZ') AS iso_date;

-- Разобрать временные метки в журнале
SELECT
    log_id,
    strptime(timestamp_string, '%Y-%m-%d %H:%M:%S') AS parsed_time,
    message
FROM raw_logs;

Обязательные параметры:

Имя

Тип

Описание

string_expr

text

Строка для преобразования во временную метку

format_string

text

Строка форматирования с описанием формата входной строки

epoch(timestamp_expr) returns BIGINT #

Преобразует временные метки в секунды эпохи Unix (количество секунд, прошедших с 1970-01-01 00:00:00 UTC).

Пример 21.25.

-- Получить текущее время эпохи Unix
SELECT epoch(NOW()) AS current_epoch;

-- Преобразовать временные метки для использования в API
SELECT
    event_id,
    epoch(event_timestamp) AS epoch_seconds
FROM events;

-- Отфильтровать, используя время эпохи Unix
SELECT * FROM events
WHERE epoch(created_at) > 1640995200; -- After 2022-01-01

Обязательные параметры:

Имя

Тип

Описание

map_col

duckdb.map

Ассоциативный массив, из которого необходимо извлечь параметры

key

duckdb.unresolved_type

Ключ, который необходимо найти в ассоциативном массиве

epoch_ms(timestamp_expr) returns BIGINT #

Преобразует временные метки в миллисекунды эпохи Unix.

Пример 21.26.

-- Высокоточная временная метка для JavaScript
SELECT epoch_ms(NOW()) AS timestamp_ms;

-- Для данных временных рядов
SELECT
    sensor_id,
    epoch_ms(reading_time) AS timestamp_ms,
    value
FROM sensor_readings;

Обязательные параметры:

Имя

Тип

Описание

timestamp_expr

timestamp

Временная метка, которую необходимо преобразовать в миллисекунды эпохи Unix

epoch_ms(milliseconds) returns TIMESTAMP #

Преобразует миллисекунды эпохи Unix во временную метку.

Пример 21.27.

-- Преобразовать миллисекунды эпохи Unix во временную метку
SELECT epoch_ms(1640995200000) AS timestamp_from_ms; -- 2022-01-01 00:00:00

-- Преобразовать сохранённые миллисекунды обратно во временные метки
SELECT
    event_id,
    epoch_ms(timestamp_ms) AS event_time
FROM events;

Обязательные параметры:

Имя

Тип

Описание

milliseconds

bigint

Миллисекунды, прошедшие с начала эпохи Unix

epoch_us(timestamp_expr) returns BIGINT #

Преобразовывает временные метки в микросекунды эпохи Unix.

Пример 21.28.

-- Временные метки с точностью до микросекунды
SELECT epoch_us(NOW()) AS timestamp_us;

Обязательные параметры:

Имя

Тип

Описание

timestamp_expr

timestamp

Временная метка, которую необходимо преобразовать в микросекунды эпохи Unix

epoch_ns(timestamp_expr) returns BIGINT #

Преобразовывает временные метки в наносекунды эпохи Unix.

Пример 21.29.

-- Временные метки с точностью до наносекунды
SELECT epoch_ns(NOW()) AS timestamp_ns;

Обязательные параметры:

Имя

Тип

Описание

timestamp_expr

timestamp

Временная метка, которую необходимо преобразовать в наносекунды эпохи Unix

make_timestamp(microseconds) returns TIMESTAMP #

Создаёт временную метку из микросекунд, прошедших с начала эпохи Unix (1970-01-01 00:00:00 UTC).

Пример 21.30.

-- Создать временную метку из текущего времени в микросекундах эпохи Unix
SELECT make_timestamp(epoch_us(NOW())) AS reconstructed_timestamp;

-- Создать определённую временную метку
SELECT make_timestamp(1640995200000000) AS new_years_2022; -- 2022-01-01 00:00:00

Обязательные параметры:

Имя

Тип

Описание

microseconds

BIGINT

Микросекунды, прошедшие с начала эпохи Unix

make_timestamptz(microseconds) returns TIMESTAMPTZ #

Создаёт временную метку с часовым поясом из микросекунд, прошедших с начала эпохи Unix.

Пример 21.31.

-- Создать timestamptz из текущих микросекунд эпохи
SELECT make_timestamptz(epoch_us(NOW())) AS reconstructed_timestamptz;

-- Создать конкретную timestamptz
SELECT make_timestamptz(1640995200000000) AS new_years_2022_tz;

Обязательные параметры:

Имя

Тип

Описание

microseconds

bigint

Микросекунды, прошедшие с начала эпохи Unix