DateTime64
Позволяет хранить момент времени, который может быть представлен как календарная дата и время, с заданной суб-секундной точностью.
Размер тика (точность, precision): 10-precision секунд, где precision - целочисленный параметр. Возможные значения: [ 0 : 9 ]. Обычно используются - 3 (миллисекунды)(default), 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.99999999] (Примечание: Точность максимального значения составляет 8).
Примеры
- Создание таблицы со столбцом типа
DateTime64
и вставка данных в неё:
CREATE TABLE dt
(
`timestamp` DateTime64(3, 'Europe/Moscow'),
`event_id` UInt8
)
ENGINE = TinyLog;
INSERT INTO dt Values (1546300800000, 1), ('2019-01-01 00:00:00', 2);
SELECT * FROM dt;
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 03:00:00.000 │ 1 │
│ 2019-01-01 00:00:00.000 │ 2 │
└─────────────────────────┴──────────┘
- При вставке даты-времени как числа (аналогично ‘Unix timestamp’), время трактуется как UTC. Unix timestamp
1546300800
в часовом поясеEurope/London (UTC+0)
представляет время'2019-01-01 00:00:00'
. Однако, столбецtimestamp
имеет типDateTime('Europe/Moscow (UTC+3)')
, так что при выводе в виде строки время отобразится как2019-01-01 03:00:00
. - При вставке даты-времени в виде строки, время трактуется соответственно часовому поясу установленному для колонки.
'2019-01-01 00:00:00'
трактуется как время по Москве (и в базу сохраняется'2018-12-31 21:00:00'
в виде Unix Timestamp).
- Фильтрация по значениям даты и времени
SELECT * FROM dt WHERE timestamp = toDateTime64('2019-01-01 00:00:00', 3, 'Europe/Moscow');
┌───────────────timestamp─┬─event_id─┐
│ 2019-01-01 00:00:00.000 │ 2 │
└─────────────────────────┴──────────┘
В отличие от типа DateTime
, DateTime64
не конвертируется из строк автоматически.
- Получение часового пояса для значения типа
DateTime64
:
SELECT toDateTime64(now(), 3, 'Europe/Moscow') AS column, toTypeName(column) AS x;
┌──────────────────column─┬─x──────────────────────────────┐
│ 2019-10-16 04:12:04.000 │ DateTime64(3, 'Europe/Moscow') │
└─────────────────────────┴────────────────────────────────┘
- Конвертация часовых поясов
SELECT
toDateTime64(timestamp, 3, 'Europe/London') as lon_time,
toDateTime64(timestamp, 3, 'Europe/Moscow') as mos_time
FROM dt;
┌───────────────lon_time──┬────────────────mos_time─┐
│ 2019-01-01 00:00:00.000 │ 2019-01-01 03:00:00.000 │
│ 2018-12-31 21:00:00.000 │ 2019-01-01 00:00:00.000 │
└─────────────────────────┴─────────────────────────┘
See Also
- Функции преобразования типов
- Функции для работы с датой и временем
- Функции для работы с массивами
- Настройка
date_time_input_format
- Настройка
date_time_output_format
- Конфигурационный параметр сервера
timezone
- Параметр
session_timezone
- Операторы для работы с датой и временем
- Тип данных
Date
- Тип данных
DateTime