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

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').

Универсальный Unix timestamp хранится в таблицах, а часовой пояс используется для преобразования его в текстовый формат или обратно при импорте/экспорте данных или для выполнения календарных вычислений на значениях (например: функции toDate, toHour и т. д.). Часовой пояс не хранится в строках таблицы (или в наборе результатов), но хранится в метаданных колонки.

Список поддерживаемых часовых поясов можно найти в IANA Time Zone Database и также можно запросить с помощью 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.

Примеры

1. Создание таблицы с колонкой типа DateTime и вставка данных в нее:

  • При вставке времени в виде целого числа оно рассматривается как Unix Timestamp (UTC). 1546300800 представляет собой '2019-01-01 00:00:00' UTC. Однако, так как колонка timestamp имеет указанный часовой пояс Asia/Istanbul (UTC+3), при выводе в виде строки значение будет отображено как '2019-01-01 03:00:00'
  • При вставке строкового значения как времени, оно рассматривается как находящееся в часовом поясе колонки. '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.
  • Часы двигаются назад ("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.

Смотрите также