#clickhouse
#clickhouse
Вопрос:
ClickHouse пока не поддерживает DateTime с миллисекундами.
Я видел два возможных предложения относительно таких полей, как: 2019-03-17T14:00:32.296Z
-
multiply by 100 an store it in UInt32/64
. Как мне использовать умножение на 100 и сохранить как UInt32? -
to store milliseconds separately
. Есть ли способ удалить миллисекунды из2019-03-17T14:00:32.296Z
=>2019-03-17 14:00:32
?
Спасибо за вашу помощь!
Комментарии:
1. Я думаю, вы имели в виду
multiply by 1000
Ответ №1:
Следует использовать тип datetime64 — https://clickhouse.com/docs/en/sql-reference/data-types/datetime64 /
Ответ №2:
На мой взгляд, основная идея, почему ClickHouse не поддерживает миллисекунды в DateTime, заключается в худшем сжатии.
Короче говоря: используйте DateTime и прецессию по секундам. Если вы хотите сохранить миллисекунды, вы можете использовать два способа:
-
Храните миллисекунды отдельно, чтобы у вас было DateTime с вашей датой, которое вы могли бы использовать во всех возможных функциях DateTime, а также в качестве первичных ключей. И поместите часть миллисекунд в отдельный столбец с типом UInt16. Вы должны подготовить данные отдельно перед сохранением. Зависит от того, какой язык вы используете для предварительной обработки данных перед сохранением, это могут быть разные способы сделать это. В golang это можно было бы сделать:
time.Now().UnixNano() / 1e6 % 1e3
-
Другой способ — сохранить все как временную метку. Это означает, что вы должны самостоятельно преобразовать свою дату в временную метку unix с миллисекундами и поместить ее в ClickHouse как Uint64. Это также зависит от того, что вы используете для подготовки вставок. Для golang это может быть похоже:
time.Now().UnixNano() / 1e6