将毫秒转换为 DateTime
Cast milliseconds to DateTime
我有 Kafka 集成对象:
CREATE TABLE topic_kafka
(
topic_data String
) ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'topic',
kafka_group_name = 'clickhouse_group',
kafka_format = 'JSONAsString',
kafka_num_consumers = 1;
CREATE TABLE topic
(
time DateTime64(3),
user_id Int32 NOT NULL,
version String
) ENGINE = MergeTree()
ORDER BY (user_id, time);
CREATE MATERIALIZED VIEW topic_consumer
TO topic AS
SELECT
JSONExtract(topic_data, 'time', 'Int64') as time,
toInt32(JSON_VALUE(topic_data, '$.data.user_id')) as user_id,
JSON_VALUE(topic_data, '$.data.version') as version
FROM topic_kafka;
Kafka 主题 json 数据嵌套对象,像这样:
{"time":1639387657456,"data":{"user_id":42,"version":"1.2.3"}}
问题是时间在 topic
table 中有值 2282-12-31 00:00:00.000
。
也可以通过以下查询进行检查:
select cast (1639387657456 as DateTime64(3)) as dt
但对于隐式日期转换以下的 DML 查询工作正常,如文档所述:
insert into topic (time, user_id) values ( 1640811600000, 42)
我发现这样的转换也很好用:
select cast (1639387657.456 as DateTime64(3)) as dt
看来我遗漏了文档中的某些内容。
上面的视图 topic_consumer
有什么问题?可以将毫秒除以 1000 以将其显式转换为 DateTime
吗?
来自 UnixTimestamp64Milli
select fromUnixTimestamp64Milli(toInt64(1640811600000));
┌─fromUnixTimestamp64Milli(toInt64(1640811600000))─┐
│ 2021-12-29 21:00:00.000 │
└──────────────────────────────────────────────────┘
我有 Kafka 集成对象:
CREATE TABLE topic_kafka
(
topic_data String
) ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka:9092',
kafka_topic_list = 'topic',
kafka_group_name = 'clickhouse_group',
kafka_format = 'JSONAsString',
kafka_num_consumers = 1;
CREATE TABLE topic
(
time DateTime64(3),
user_id Int32 NOT NULL,
version String
) ENGINE = MergeTree()
ORDER BY (user_id, time);
CREATE MATERIALIZED VIEW topic_consumer
TO topic AS
SELECT
JSONExtract(topic_data, 'time', 'Int64') as time,
toInt32(JSON_VALUE(topic_data, '$.data.user_id')) as user_id,
JSON_VALUE(topic_data, '$.data.version') as version
FROM topic_kafka;
Kafka 主题 json 数据嵌套对象,像这样:
{"time":1639387657456,"data":{"user_id":42,"version":"1.2.3"}}
问题是时间在 topic
table 中有值 2282-12-31 00:00:00.000
。
也可以通过以下查询进行检查:
select cast (1639387657456 as DateTime64(3)) as dt
但对于隐式日期转换以下的 DML 查询工作正常,如文档所述:
insert into topic (time, user_id) values ( 1640811600000, 42)
我发现这样的转换也很好用:
select cast (1639387657.456 as DateTime64(3)) as dt
看来我遗漏了文档中的某些内容。
上面的视图 topic_consumer
有什么问题?可以将毫秒除以 1000 以将其显式转换为 DateTime
吗?
来自 UnixTimestamp64Milli
select fromUnixTimestamp64Milli(toInt64(1640811600000));
┌─fromUnixTimestamp64Milli(toInt64(1640811600000))─┐
│ 2021-12-29 21:00:00.000 │
└──────────────────────────────────────────────────┘