【问题标题】:Cast milliseconds to DateTime将毫秒转换为 DateTime
【发布时间】:2022-01-17 21:38:27
【问题描述】:

我有 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 表中有值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?

【问题讨论】:

    标签: clickhouse


    【解决方案1】:

    来自UnixTimestamp64Milli

    https://clickhouse.com/docs/en/sql-reference/functions/type-conversion-functions/#tounixtimestamp64nano

    select fromUnixTimestamp64Milli(toInt64(1640811600000));
    ┌─fromUnixTimestamp64Milli(toInt64(1640811600000))─┐
    │                          2021-12-29 21:00:00.000 │
    └──────────────────────────────────────────────────┘
    

    【讨论】:

    • 感谢您的链接。我在文档的Date and Times 部分进行了搜索。 BWT 为什么插入查询的隐式转换工作正常,而物化视图的隐式转换却不行?
    • 最初只针对insert into values实现,而datetime64内部是==十进制,不容易推导出1640811600000 = 1640811600.000
    • 好的,我明白了。这是一个特点。并感谢您提供详细信息!
    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2012-09-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    相关资源
    最近更新 更多