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

DateTime64

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

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

Синтаксис:

DateTime64(precision, [timezone])

Внутренне данные хранятся как количество «тиков» с начала эпохи (1970-01-01 00:00:00 UTC) в виде Int64. Точность определяется параметром precision. Дополнительно тип DateTime64 может хранить часовой пояс, общий для всего столбца, который влияет на то, как значения типа DateTime64 отображаются в текстовом формате и как интерпретируются значения, заданные в виде строк ('2020-01-01 05:00:01.000'). Часовой пояс не хранится в строках таблицы (или в результате выборки), а сохраняется в метаданных столбца. Подробности см. в DateTime.

Поддерживаемый диапазон значений: [1900-01-01 00:00:00, 2299-12-31 23:59:59.999999999]

Количество цифр после десятичной точки зависит от параметра precision.

Примечание: точность максимального значения равна 8. Если используется максимальная точность в 9 цифр (наносекунды), максимальное поддерживаемое значение — 2262-04-11 23:47:16 в UTC.

Примеры

  1. Создание таблицы со столбцом типа DateTime64 и вставка данных в неё:
CREATE TABLE dt64
(
    `timestamp` DateTime64(3, 'Asia/Istanbul'),
    `event_id` UInt8
)
ENGINE = TinyLog;
-- Разбор DateTime
-- - из целого числа, интерпретируемого как количество микросекунд (из-за точности 3) с 1970-01-01,
-- - из десятичного числа, интерпретируемого как количество секунд до десятичной точки, с учётом точности после десятичной точки,
-- - из строки.
INSERT INTO dt64 VALUES (1546300800123, 1), (1546300800.123, 2), ('2019-01-01 00:00:00', 3);

SELECT * FROM dt64;
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │        1 │
│ 2019-01-01 03:00:00.123 │        2 │
│ 2019-01-01 00:00:00.000 │        3 │
└─────────────────────────┴──────────┘
  • При вставке значения даты и времени в виде целого числа оно интерпретируется как Unix‑временная метка (UTC) с соответствующей точностью. 1546300800000 (c точностью 3) представляет '2019-01-01 00:00:00' UTC. Однако, так как для столбца timestamp указана временная зона Asia/Istanbul (UTC+3), при выводе в виде строки значение будет показано как '2019-01-01 03:00:00'. Вставка даты и времени в виде десятичного числа обрабатывается аналогично целому числу, за исключением того, что значение до десятичной точки — это Unix‑временная метка с точностью до секунд включительно, а часть после десятичной точки интерпретируется как точность.
  • При вставке строкового значения как даты и времени оно интерпретируется как значение во временной зоне столбца. '2019-01-01 00:00:00' будет интерпретировано как значение во временной зоне Asia/Istanbul и сохранено как 1546290000000.
  1. Фильтрация по значениям DateTime64
SELECT * FROM dt64 WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Asia/Istanbul');
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │        3 │
└─────────────────────────┴──────────┘

В отличие от DateTime, значения DateTime64 не преобразуются из String автоматически.

SELECT * FROM dt64 WHERE timestamp = toDateTime64(1546300800.123, 3);
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.123 │        1 │
│ 2019-01-01 03:00:00.123 │        2 │
└─────────────────────────┴──────────┘

В отличие от операции вставки, функция toDateTime64 будет рассматривать все значения как значения с дробной частью, поэтому точность должна указываться после десятичного разделителя.

  1. Получение часового пояса для значения типа DateTime64:
SELECT toDateTime64(now(), 3, 'Asia/Istanbul') AS column, toTypeName(column) AS x;
┌──────────────────column─┬─x──────────────────────────────┐
│ 2023-06-05 00:09:52.000 │ DateTime64(3, 'Asia/Istanbul') │
└─────────────────────────┴────────────────────────────────┘
  1. Конвертация часовых поясов
SELECT
toDateTime64(timestamp, 3, 'Europe/London') AS lon_time,
toDateTime64(timestamp, 3, 'Asia/Istanbul') AS istanbul_time
FROM dt64;
┌────────────────lon_time─┬───────────istanbul_time─┐
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2019-01-01 00:00:00.123 │ 2019-01-01 03:00:00.123 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘

См. также