DateTime
Позволяет сохранить момент во времени, который может быть выражен как календарная дата и время суток.
Синтаксис:
Поддерживаемый диапазон значений: [1970-01-01 00:00:00, 2106-02-07 06:28:15].
Разрешение: 1 секунда.
Speed
Тип данных Date
быстрее, чем DateTime
при большинстве условий.
Тип Date
требует 2 байта памяти, в то время как DateTime
требует 4. Однако, когда база данных сжимает данные, эта разница увеличивается. Это усиление вызвано тем, что минуты и секунды в DateTime
менее сжимаемы. Фильтрация и агрегация Date
вместо DateTime
также быстрее.
Usage Remarks
Момент времени сохраняется как Unix timestamp, независимо от часового пояса или перехода на летнее/зимнее время. Часовой пояс влияет на то, как значения типа DateTime
отображаются в текстовом формате и как значения, указанные в виде строк, парсятся ('2020-01-01 05:00:01').
Безучетный Unix timestamp сохраняется в таблицах, и часовой пояс используется для преобразования его в текстовый формат или обратно во время импорта/экспорта данных или для выполнения календарных вычислений по значениям (например: функции toDate
, toHour
и др.). Часовой пояс не хранится в строках таблицы (или в результирующем наборе), но хранится в метаданных столбца.
Список поддерживаемых часовых поясов можно найти в Базе данных часовых поясов IANA и также можно запросить с помощью SELECT * FROM system.time_zones
. Список также доступен на Вики.
Вы можете явно задать часовой пояс для столбцов типа 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.
Examples
1. Создание таблицы со столбцом типа 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. Конвертация часового пояса
Поскольку конвертация часового пояса изменяет только метаданные, операция не имеет вычислительной стоимости.
Limitations on time zones support
Некоторые часовые пояса могут не поддерживаться полностью. Есть несколько случаев:
Если смещение от UTC не является кратным 15 минутам, расчеты часов и минут могут быть некорректными. Например, часовой пояс в Монровии, Либерия, имеет смещение UTC -0:44:30 до 7 января 1972 года. Если вы выполняете расчеты по историческому времени в часовом поясе Монровии, функции обработки времени могут дать некорректные результаты. Тем не менее, результаты после 7 января 1972 года будут правильными.
Если переход времени (из-за перехода на летнее/зимнее время или по другим причинам) был осуществлен в момент времени, не кратный 15 минутам, вы также можете получить некорректные результаты в этот конкретный день.
Некорректные календарные даты. Например, в Happy Valley - Goose Bay время было переведено на один час назад в 00:01:00 7 ноября 2010 года (за одну минуту до полуночи). Таким образом, после завершения 6 ноября люди наблюдали целую одну минуту 7 ноября, затем время было изменено обратно на 23:01 6 ноября, и после еще 59 минут 7 ноября началось снова. ClickHouse пока не поддерживает такого рода забавы. В течение этих дней результаты функций обработки времени могут быть несколько некорректными.
Похожая проблема существует для станции Casey в Антарктиде в 2010 году. Они перевели время на три часа назад 5 марта в 02:00. Если вы работаете на антарктической станции, пожалуйста, не стесняйтесь использовать ClickHouse. Просто убедитесь, что вы установили часовой пояс в UTC или будьте осведомлены о неточностях.
Смещения времени на несколько дней. Некоторые тихоокеанские острова изменили свое смещение пояса от UTC+14 до UTC-12. Это нормально, но могут возникать некоторые неточности, если вы выполняете расчеты с их часовым поясом по историческим временным точкам в дни перехода.
Handling Daylight Saving Time (DST)
Тип DateTime в ClickHouse с часовыми поясами может проявлять неожиданные особенности поведения во время переходов на летнее время (DST), особенно когда:
date_time_output_format
установлен вsimple
.- Часы идут назад ("Fall Back"), что приводит к перекрытию на один час.
- Часы идут вперед ("Spring Forward"), что приводит к пропуску одного часа.
По умолчанию ClickHouse всегда выбирает более ранний случай перекрытия времени и может интерпретировать несуществующее время во время перехода вперед.
Например, рассмотрим следующий переход от времени летнего времени (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
.