DateTime
Позволяет хранить мгновение времени, которое может быть выражено как календарная дата и время в течение суток.
Синтаксис:
Поддерживаемый диапазон значений: [1970-01-01 00:00:00, 2106-02-07 06:28:15].
Разрешение: 1 секунда.
Скорость
Тип данных Date
быстрее, чем DateTime
в большинстве условий.
Тип Date
требует 2 байта для хранения, в то время как DateTime
требует 4. Тем не менее, когда база данных сжимает данные, эта разница увеличивается. Это увеличение связано с тем, что минуты и секунды в DateTime
менее сжимаемы. Фильтрация и агрегация Date
вместо DateTime
также происходит быстрее.
Заметки по использованию
Момент времени сохраняется как Unix timestamp, вне зависимости от часового пояса или перехода на летнее/зимнее время. Часовой пояс влияет на то, как значения типа DateTime
отображаются в текстовом формате и как значения, указанные в виде строк, разбираются ('2020-01-01 05:00:01').
Часовой пояс не хранится в строках таблицы (или в результирующем наборе), но хранится в метаданных колонки.
Список поддерживаемых часовых поясов можно найти в IANA Time Zone Database и также можно запросить с помощью SELECT * FROM system.time_zones
. Список также доступен на Wikipedia.
Вы можете явно установить часовой пояс для колонок с типом DateTime
, когда создаете таблицу. Пример: DateTime('UTC')
. Если часовой пояс не установлен, ClickHouse использует значение параметра timezone из настроек сервера или настройки операционной системы на момент запуска сервера ClickHouse.
clickhouse-client по умолчанию применяет часовой пояс сервера, если часовой пояс не установлен явно при инициализации типа данных. Чтобы использовать часовой пояс клиента, запустите clickhouse-client
с параметром --use_client_time_zone
.
ClickHouse выводит значения в зависимости от значения настройки date_time_output_format. Формат текста по умолчанию — YYYY-MM-DD hh:mm:ss
. Кроме того, вы можете изменить вывод с помощью функции formatDateTime.
При вставке данных в ClickHouse вы можете использовать различные форматы строк даты и времени, в зависимости от значения настройки date_time_input_format.
Примеры
1. Создание таблицы с колонкой типа DateTime
и вставка данных в неё:
- При вставке datetime как целого числа оно трактуется как Unix Timestamp (UTC).
1546300800
представляет собой'2019-01-01 00:00:00'
UTC. Однако, поскольку в колонкеtimestamp
указан часовой поясAsia/Istanbul
(UTC+3), при выводе в виде строки значение будет показано как'2019-01-01 03:00:00'
. - При вставке строкового значения как datetime оно воспринимается как значение в часовом поясе колонки.
'2019-01-01 00:00:00'
будет воспринято как находящееся в часовом поясеAsia/Istanbul
и сохранено как1546290000
.
2. Фильтрация по значениям DateTime
Значения колонки DateTime
могут фильтроваться, используя строковое значение в предикате WHERE
. Оно будет автоматически преобразовано в DateTime
:
3. Получение часового пояса для колонки типа DateTime
:
4. Конвертация часового пояса
Поскольку конвертация часового пояса изменяет только метаданные, операция не имеет вычислительных затрат.
Ограничения на поддержку часовых поясов
Некоторые часовые пояса могут быть не поддержаны полностью. Существует несколько случаев:
Если смещение от UTC не кратно 15 минутам, расчет часов и минут может быть некорректным. Например, часовой пояс в Монровии, Либерия, имел смещение UTC -0:44:30 до 7 января 1972 года. Если вы проводите расчеты по историческому времени в часовом поясе Монровии, функции обработки времени могут давать неверные результаты. Тем не менее, результаты после 7 января 1972 года будут корректными.
Если переход во времени (из-за перехода на летнее/зимнее время или по другим причинам) был выполнен в момент, который не кратен 15 минутам, вы также можете получить некорректные результаты в этот конкретный день.
Не-монтонические календарные даты. Например, в Хэппи Вэлли - Гус Бэй, время было переведено на один час назад в 00:01:00 7 ноября 2010 года (одна минута после полуночи). Таким образом, после окончания 6 ноября люди наблюдали целую минуту 7 ноября, затем время было изменено обратно на 23:01 6 ноября, и после еще 59 минут 7 ноября снова начался. ClickHouse не (еще) поддерживает подобные вещи. В течение этих дней результаты функций обработки времени могут быть слегка некорректны.
Похожие проблемы существуют для антарктической станции Кейси в 2010 году. Время было переведено на три часа назад 5 марта в 02:00. Если вы работаете на антарктической станции, пожалуйста, не бойтесь использовать ClickHouse. Просто убедитесь, что вы установили часовой пояс на UTC или будьте осведомлены о неточностях.
Сдвиги времени на несколько дней. Некоторые тихоокеанские острова изменили свое смещение пояса от UTC+14 до UTC-12. Это нормально, но некоторые неточности могут возникать, если вы проводите расчеты с их часовым поясом для исторических временных точек в дни конверсии.
Обработка перехода на летнее/зимнее время (DST)
Тип данных DateTime ClickHouse с часовыми поясами может демонстрировать неожиданное поведение во время переходов на летнее/зимнее время (DST), особенно когда:
date_time_output_format
установлен вsimple
.- Часы движутся назад ("Падение"), что приводит к нал overlaping на один час.
- Часы движутся вперед ("Весенний переход"), что создает часовой промежуток.
По умолчанию ClickHouse всегда выбирает более раннее событие при нал overlaping времени и может интерпретировать несуществующие времена во время смещения вперед.
Например, рассмотрим следующий переход от летнего времени (DST) к стандартному времени.
- 29 октября 2023 года в 02:00:00 часы движутся назад к 01:00:00 (BST → GMT).
- Час 01:00:00 – 01:59:59 появляется дважды (один раз в BST и один раз в GMT).
- ClickHouse всегда выбирает первое событие (BST), вызывая неожиданные результаты при добавлении временных интервалов.
Аналогично, во время перехода от стандартного времени к летнему времени, один час может оказаться пропущенным.
Например:
- 26 марта 2023 года в
00:59:59
часы прыгают вперед к 02:00:00 (GMT → BST). - Час
01:00:00
–01:59:59
не существует.
В этом случае ClickHouse сдвигает несуществующее время 2023-03-26 01:30:00
назад до 2023-03-26 00:30:00
.