Перейти к основному содержанию
Перейти к основному содержанию

Time64

Тип данных Time64 представляет время суток с дробными секундами. Он не содержит компонентов календарной даты (день, месяц, год). Параметр precision определяет количество знаков после запятой и, соответственно, размер тика.

Размер тика (precision): 10-precision секунды. Допустимый диапазон: 0..9. Наиболее часто используются значения: 3 (миллисекунды), 6 (микросекунды) и 9 (наносекунды).

Синтаксис:

Time64(precision)

Внутренне тип Time64 хранит знаковое 64-битное десятичное число (Decimal64), представляющее дробные секунды. Разрешение тиков определяется параметром precision. Часовые пояса не поддерживаются: указание часового пояса для Time64 приведёт к ошибке.

В отличие от DateTime64, Time64 не хранит дату. См. также Time.

Диапазон текстового представления значений: [-999:59:59.000, 999:59:59.999] для precision = 3. В общем случае минимум — -999:59:59, максимум — 999:59:59 с количеством дробных цифр до значения precision (для precision = 9 минимум — -999:59:59.999999999).

Подробности реализации

Представление.
Знаковое значение типа Decimal64, представляющее количество долей секунды с precision знаками после запятой.

Нормализация.
При разборе строк в значение типа Time64 компоненты времени нормализуются, но не проверяются на корректность.
Например, 25:70:70 интерпретируется как 26:11:10.

Отрицательные значения.
Ведущий знак минус поддерживается и сохраняется.
Отрицательные значения обычно возникают в результате арифметических операций над значениями Time64.
Для Time64 отрицательные входные значения сохраняются как для текстовых (например, '-01:02:03.123'), так и для числовых входных данных (например, -3723.123).

Сатурация (ограничение диапазона).
Компонента времени суток ограничивается диапазоном [-999:59:59.xxx, 999:59:59.xxx] при преобразовании в компоненты или сериализации в текст.
Сохраняемое числовое значение может выходить за этот диапазон; однако любое извлечение компонентов (часы, минуты, секунды) и текстовое представление используют ограниченное (сатурированное) значение.

Часовые пояса.
Time64 не поддерживает часовые пояса.
Указание часового пояса при создании типа или значения Time64 приводит к ошибке.
Аналогично, попытки применить или изменить часовой пояс для столбцов Time64 не поддерживаются и приводят к ошибке.

Примеры

  1. Создание таблицы со столбцом типа Time64 и вставка в неё данных:
CREATE TABLE tab64
(
    `event_id` UInt8,
    `time` Time64(3)
)
ENGINE = TinyLog;
-- Разбор Time64
-- - из строки,
-- - из количества секунд с 00:00:00 (дробная часть согласно заданной точности).
INSERT INTO tab64 VALUES (1, '14:30:25'), (2, 52225.123), (3, '14:30:25');

SELECT * FROM tab64 ORDER BY event_id;
   ┌─event_id─┬────────time─┐
1. │        1 │ 14:30:25.000 │
2. │        2 │ 14:30:25.123 │
3. │        3 │ 14:30:25.000 │
   └──────────┴──────────────┘
  1. Фильтрация по значениям типа Time64
SELECT * FROM tab64 WHERE time = toTime64('14:30:25', 3);
   ┌─event_id─┬────────time─┐
1. │        1 │ 14:30:25.000 │
2. │        3 │ 14:30:25.000 │
   └──────────┴──────────────┘
SELECT * FROM tab64 WHERE time = toTime64(52225.123, 3);
   ┌─event_id─┬────────time─┐
1. │        2 │ 14:30:25.123 │
   └──────────┴──────────────┘

Примечание: toTime64 разбирает числовые литералы как секунды с дробной частью в соответствии с указанной точностью, поэтому явно указывайте требуемое количество знаков после запятой.

  1. Проверка получившегося типа:
SELECT CAST('14:30:25.250' AS Time64(3)) AS column, toTypeName(column) AS type;
   ┌────────column─┬─type──────┐
1. │ 14:30:25.250 │ Time64(3) │
   └───────────────┴───────────┘

См. также