【问题标题】:How to get current year on cassandra如何在 cassandra 上获取当前年份
【发布时间】:2018-06-03 11:13:46
【问题描述】:

如何在 Cassandra 中获取当前日期的一部分?在我的特殊情况下,我只需要得到年份。

我暂时想到了这个select dateof(now()) from system.local;

但我找不到任何函数来获取文档中的年份 https://docs.datastax.com/en/dse/5.1/cql/cql/cql_reference/refCqlFunction.html#refCqlFunction__toTimestamp

我是 Cassandra 的新手,所以这可能是一个愚蠢的问题。

【问题讨论】:

    标签: cassandra cql cassandra-3.0


    【解决方案1】:

    安全的方法是返回一个时间戳并在客户端解析出年份。

    Cassandra 本身没有任何功能可以帮助解决这个问题。但是,您可以编写用户定义函数 (UDF) 来完成此操作:

    首先,默认情况下禁用用户定义的功能。您需要在 cassandra.yaml 中调整该设置并重新启动节点。

    enable_user_defined_functions=true
    

    注意:此设置默认采用这种方式是有原因的。尽管 Cassandra 3.x 有一些适当的保护措施来防止恶意代码,但最好将其关闭,除非您需要它并且您知道自己在做什么。即便如此,您仍需要密切关注已定义的 UDF。

    现在我将在 cqlsh 中使用 Java 创建我的函数:

    cassdba@cqlsh:stackoverflow> CREATE OR REPLACE FUNCTION year (input DATE)
    RETURNS NULL ON NULL INPUT RETURNS TEXT
    LANGUAGE java AS 'return input.toString().substring(0,4);';
    

    请注意,查询当前日期/时间有多种方式(和类型):

    cassdba@cqlsh:stackoverflow> SELECT todate(now()) as date,
        totimestamp(now()) as timestamp, now() as timeuuid FROm system.local;
    
     date       | timestamp                       | timeuuid
    ------------+---------------------------------+-------------------------------------
     2017-12-20 | 2017-12-20 21:18:37.708000+0000 | 58167cc1-e5cb-11e7-9765-a98c427e8248
    
    (1 rows)
    

    只返回一年,我可以在todate(now()) 列上调用我的year 函数:

    SELECT stackoverflow.year(todate(now())) as year FROm system.local;
    
     year
    ------
     2017
    
    (1 rows)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-10
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 2014-07-20
      相关资源
      最近更新 更多