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

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:0001:59:59 не существует.

В этом случае ClickHouse смещает несуществующее время 2023-03-26 01:30:00 назад на 2023-03-26 00:30:00.

See Also