Перейти к содержимому
Последнее обновление

TIMESTAMP_NS

Описание​

TIMESTAMP_NS хранит дату и время без часового пояса с фиксированной точностью до наносекунд. Этот тип предназначен для времени событий, трассировок и других данных, для которых микросекундной точности DATETIME(6) недостаточно.

Внутри Doris значение хранится как знаковое 64-битное число наносекунд относительно эпохи Unix. Поэтому столбец TIMESTAMP_NS занимает 8 байт и имеет следующий точный диапазон значений:

[1677-09-21 00:12:43.145224192, 2262-04-11 23:47:16.854775807]

Формат вывода: yyyy-MM-dd HH:mm:ss.SSSSSSSSS. Всегда отображаются все девять цифр дробной части секунды, включая завершающие нули.

В отличие от DATETIME(p), у TIMESTAMP_NS точность не настраивается. Объявления вида TIMESTAMP_NS(9) недопустимы.

TIMESTAMP_NS можно использовать для ключевого столбца, столбца партиционирования, столбца распределения по бакетам, столбца последовательности и столбца значений. Он также поддерживается в значениях ARRAY, MAP, STRUCT и типизированного VARIANT.

Синтаксис​

TIMESTAMP_NS

Семантика часовых поясов​

TIMESTAMP_NS не хранит часовой пояс. Изменение переменной сеанса time_zone не влияет на уже сохранённое значение.

Если входная строка содержит смещение или название часового пояса, Doris при её разборе преобразует входное значение в часовой пояс сеанса или загрузки данных, а затем сохраняет полученные локальные дату и время без часового пояса. Если во входных данных часовой пояс отсутствует, Doris сохраняет поля даты и времени как есть.

Используйте TIMESTAMPTZ, если значение представляет момент времени, который нужно отображать в разных часовых поясах сеанса.

Преобразования и операции​

Строки могут содержать до девяти цифр дробной части секунды. Если цифр больше, Doris округляет значение до наносекунд; перенос при округлении может привести к переходу на следующую секунду или дату. Значения за пределами поддерживаемого диапазона недопустимы.

TIMESTAMP_NS поддерживает преобразования в числовые и символьные типы, а также в типы DATE, DATETIME, TIME, TIMESTAMPTZ и VARIANT и обратно. При преобразовании в тип даты или времени с меньшей точностью значение округляется до целевой точности. Полные правила приведены в разделе Преобразование в TIMESTAMP_NS.

Функции извлечения компонентов даты и времени, форматирования, арифметических вычислений и сравнения, а также агрегатные, условные и оконные функции поддерживают TIMESTAMP_NS. Операции, результат которых сохраняет тип TIMESTAMP_NS, сохраняют все девять цифр дробной части секунды. Операции, результат которых выходит за пределы поддерживаемого диапазона, выдают ошибку вместо циклического переполнения.

Операции с наносекундами описаны в разделах NANOSECOND, NANOSECONDS_ADD, NANOSECONDS_SUB и NANOSECONDS_DIFF.

Примеры​

Создание таблицы и сохранение значений с наносекундной точностью:

CREATE TABLE events (
id BIGINT,
event_time TIMESTAMP_NS
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES ("replication_num" = "1");

INSERT INTO events VALUES
(1, '1970-01-01 00:00:00.000000001'),
(2, '2024-02-29 12:34:56.123456789'),
(3, NULL);

SELECT * FROM events ORDER BY id;
+------+-------------------------------+
| id | event_time |
+------+-------------------------------+
| 1 | 1970-01-01 00:00:00.000000001 |
| 2 | 2024-02-29 12:34:56.123456789 |
| 3 | NULL |
+------+-------------------------------+

Округление до наносекунд выполняется по десятой цифре дробной части секунды:

SELECT CAST('1970-01-01 00:00:00.1234567895' AS TIMESTAMP_NS) AS ts;
+-------------------------------+
| ts |
+-------------------------------+
| 1970-01-01 00:00:00.123456790 |
+-------------------------------+

Суффикс часового пояса учитывается только при разборе входного значения. Сохранённое значение остаётся неизменным после изменения часового пояса сеанса:

SET time_zone = '+08:00';
CREATE TABLE timezone_example (
id INT,
ts TIMESTAMP_NS
)
DUPLICATE KEY(id)
DISTRIBUTED BY HASH(id) BUCKETS 1
PROPERTIES ("replication_num" = "1");

INSERT INTO timezone_example VALUES
(1, '2023-08-17T01:41:18.123456789Z');

SET time_zone = '+00:00';
SELECT ts FROM timezone_example;
+-------------------------------+
| ts |
+-------------------------------+
| 2023-08-17 09:41:18.123456789 |
+-------------------------------+

Если на входе NULL, возвращается NULL:

SELECT CAST(NULL AS TIMESTAMP_NS) AS ts;
+------+
| ts |
+------+
| NULL |
+------+