Типы данных для даты и времени
Наличие обширного набора типов данных для даты и времени необходимо для эффективного управления временными рядами, и 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:
Для преобразования DateTime в DateTime64 можно использовать функцию toDateTime64:
Также можно использовать toDateTime, чтобы преобразовать Date или DateTime64 обратно в DateTime: