Типы данных даты и времени
Для эффективного управления данными временных рядов необходим подробный набор типов даты и времени, и ClickHouse предоставляет именно такой набор. От компактных представлений даты до высокоточных временных меток с точностью до наносекунд — эти типы разработаны так, чтобы обеспечивать баланс между эффективностью хранения и практическими требованиями разных приложений, работающих с временными рядами.
Независимо от того, работаете ли вы с историческими финансовыми данными, показаниями IoT-датчиков или событиями с датой в будущем, типы даты и времени ClickHouse обеспечивают гибкость, необходимую для работы с различными временными сценариями данных. Диапазон поддерживаемых типов позволяет оптимизировать как пространство хранения, так и производительность запросов, сохраняя при этом точность, необходимую в вашем сценарии использования.
-
Тип
Dateподходит в большинстве случаев. Для хранения даты этому типу требуется 2 байта, а диапазон ограничен значениями[1970-01-01, 2149-06-06]. -
Date32охватывает более широкий диапазон дат. Для хранения даты этому типу требуется 4 байта, а диапазон ограничен значениями[1900-01-01, 2299-12-31] -
DateTimeхранит значения даты и времени с точностью до секунды в диапазоне[1970-01-01 00:00:00, 2106-02-07 06:28:15]. Для каждого значения требуется 4 байта. -
В случаях, когда требуется более высокая точность, можно использовать
DateTime64. Этот тип позволяет хранить время с точностью до наносекунд в диапазоне[1900-01-01 00:00:00, 2299-12-31 23:59:59.99999999]. Для каждого значения требуется 8 байт.
Давайте создадим таблицу, в которой хранятся различные типы дат:
Можно использовать функцию now(), чтобы вернуть текущее время, а now64() — чтобы получить его с указанной точностью, задаваемой первым аргументом.
При этом столбцы будут заполнены временем в соответствии с их типом:
Типы Time и Time64
В случаях, когда нужно хранить значения времени суток без даты, ClickHouse предоставляет типы Time и Time64, представленные в версии 25.6. Они удобны для описания повторяющихся расписаний, ежедневных шаблонов или других ситуаций, где дату и время имеет смысл хранить раздельно.
Чтобы использовать Time и Time64, необходимо включить настройку: SET enable_time_time64_type = 1;
Эти типы были представлены в версии 25.6
Тип Time хранит часы, минуты и секунды с точностью до секунды. Внутри он хранится как знаковое 32-битное целое число и поддерживает диапазон [-999:59:59, 999:59:59], то есть допускает значения больше 24 часов. Это может быть полезно при отслеживании прошедшего времени или выполнении арифметических операций, результат которых выходит за пределы одних суток.
Для субсекундной точности Time64 хранит время с настраиваемой дробной частью секунды как знаковое значение Decimal64. Он принимает параметр точности (0-9), который задает количество дробных знаков. Наиболее распространенные значения точности: 3 (миллисекунды), 6 (микросекунды) и 9 (наносекунды).
Ни Time, ни Time64 не поддерживают часовые пояса — они представляют собой значения времени суток без региональной привязки.
Давайте создадим таблицу со столбцами времени:
Можно вставлять значения времени, используя строковые литералы или числовые значения. Для Time числовые значения интерпретируются как секунды, прошедшие с 00:00:00. Для Time64 числовые значения интерпретируются как секунды, прошедшие с 00:00:00, при этом дробная часть интерпретируется в соответствии с точностью столбца:
Значения времени можно фильтровать привычным образом:
Часовые пояса
Во многих сценариях использования требуется также хранить часовые пояса. Часовой пояс можно задать как последний аргумент для типов DateTime или DateTime64:
Определив часовой пояс в DDL, теперь мы можем вставлять значения времени, используя разные часовые пояса:
А теперь посмотрим, что в нашей таблице:
В первой строке мы вставили все значения, используя часовой пояс America/New_York.
dt_1иdt64_1автоматически преобразуются вEurope/Berlinпри выполнении запроса.- Для
dt_2иdt64_2часовой пояс не был указан, поэтому используется локальный часовой пояс сервера, который в данном случае —Europe/London.
Во второй строке мы вставили все значения без указания часового пояса, поэтому был использован локальный часовой пояс сервера.
Как и в первой строке, dt_1 и dt64_1 преобразуются в Europe/Berlin, а dt_2 и dt64_2 используют локальный часовой пояс сервера.
Функции даты и времени
ClickHouse также предоставляет набор функций, позволяющих преобразовывать значения из одного типа данных в другой.
Например, Можно использовать toDate, чтобы преобразовать значение DateTime в тип Date:
Можно использовать toDateTime64 для преобразования DateTime в DateTime64:
И также можно использовать toDateTime, чтобы преобразовать Date или DateTime64 обратно в DateTime: