дата-время clickhouse с миллисекундами

#clickhouse

#clickhouse

Вопрос:

ClickHouse пока не поддерживает DateTime с миллисекундами.

Я видел два возможных предложения относительно таких полей, как: 2019-03-17T14:00:32.296Z

  1. multiply by 100 an store it in UInt32/64 . Как мне использовать умножение на 100 и сохранить как UInt32?

  2. 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 и прецессию по секундам. Если вы хотите сохранить миллисекунды, вы можете использовать два способа:

  1. Храните миллисекунды отдельно, чтобы у вас было DateTime с вашей датой, которое вы могли бы использовать во всех возможных функциях DateTime, а также в качестве первичных ключей. И поместите часть миллисекунд в отдельный столбец с типом UInt16. Вы должны подготовить данные отдельно перед сохранением. Зависит от того, какой язык вы используете для предварительной обработки данных перед сохранением, это могут быть разные способы сделать это. В golang это можно было бы сделать:

     time.Now().UnixNano() / 1e6 % 1e3
      
  2. Другой способ — сохранить все как временную метку. Это означает, что вы должны самостоятельно преобразовать свою дату в временную метку unix с миллисекундами и поместить ее в ClickHouse как Uint64. Это также зависит от того, что вы используете для подготовки вставок. Для golang это может быть похоже:

     time.Now().UnixNano() / 1e6