【问题标题】:How to convert a value of date type to text in Cassandra?如何在 Cassandra 中将日期类型的值转换为文本?
【发布时间】:2020-12-22 15:00:34
【问题描述】:

我有一个 Cassandra 表,其结构如下 -

CREATE TABLE timeseries_s (
   prop_name text PRIMARY KEY,
   description text,
   value text
);

现在我需要在此表中插入一个属性,其值为文本格式的当前日期。我创建了以下 CQL,但它给了我以下错误 -

 INSERT INTO timeseries_s (prop_name, description, value) VALUES ('xyz', 'abc', TODATE(now())));

错误 - SyntaxException: 第 1:168 行不匹配输入 ')' 期望 EOF (...'abc', TODATE(now()))[)]...)

此后,我尝试了以下-

 INSERT INTO timeseries_s (prop_name, description, value) VALUES ('xyz', 'Migration for DSE started at this time', CAST(TODATE(now()) AS TEXT));

错误 - 语法异常:第 1:158 行在输入 '(' (... VALUES ('xyz', 'abc', CAST) 处没有可行的替代方案

有什么建议吗?

【问题讨论】:

    标签: database cassandra cql


    【解决方案1】:

    我能想到的纯粹在 Cassandra 端解决这个问题的唯一方法是使用用户定义的函数。首先,您需要在cassandra.yaml 中启用用户定义的功能:

    enable_user_defined_functions: true
    

    一旦节点重新启动,我通过在我的 stackoverflow 键空间中定义一个名为 totext 的函数来完成此操作,如下所示:

    aploetz@cqlsh:stackoverflow> CREATE OR REPLACE FUNCTION totext (input DATE)
                 RETURNS NULL ON NULL INPUT RETURNS TEXT
                 LANGUAGE java AS 'return input.toString();';
    

    创建该函数后,您可以像这样在INSERT 中使用它:

    > INSERT INTO timeseries_s (prop_name, description, value)
    VALUES ('xyz', 'Migration for DSE started at this time',
                         stackoverflow.totext(todate(now())));
    
    > SELECT * FROM timeseries_s ;
    
     prop_name | description                            | value
    -----------+----------------------------------------+------------
           xyz | Migration for DSE started at this time | 2020-09-03
    
    (1 rows)
    

    【讨论】:

      【解决方案2】:

      TODATEcolumn_name 作为输入。此外,CAST 仅在 SELECT 语句中使用。大概你可以通过程序来实现这个东西。

      【讨论】:

        猜你喜欢
        • 2011-02-23
        • 1970-01-01
        • 1970-01-01
        • 2017-11-02
        • 1970-01-01
        • 2012-03-21
        • 1970-01-01
        • 2021-10-28
        相关资源
        最近更新 更多