Cassandra:无法将'2016-04-06 13:06:11.534000'强制转换为格式化日期(长)

时间:2016-04-06 14:21:28

标签: cassandra cql cqlsh

我正在尝试使用cqlsh更新我的cassandra数据库中的现有项目:

$ > UPDATE allEvents SET "isLastEvent" = True WHERE "websiteId" = 'sd-8231'
AND "purchaser" = False
AND "currentTime" = '2016-04-06 13:06:11.534000';

我得到了这个:

  

InvalidRequest:code = 2200 [无效查询] message =“无法强制'2016-04-06 13:06:11.534000'到格式化日期(长)”

如果可以提供帮助:

$ > show version
[cqlsh 5.0.1 | Cassandra 3.0.2 | CQL spec 3.3.1 | Native protocol v4]

2 个答案:

答案 0 :(得分:14)

那是因为Cassandra时间戳类型只支持毫秒。您的currentTime精度太高了。修剪最后三个零,这应该有效:

UPDATE allEvents SET "isLastEvent" = True 
WHERE "websiteId" = 'sd-8231'
      AND "purchaser" = False 
      AND "currentTime" = '2016-04-06 13:06:11.534';

答案 1 :(得分:2)

有一个原因是"无法强迫' 2016-04-06 13:06:11.534000'到格式化的日期(长)"虽然错误,但是,timestamp列实际上存储了所有版本中的毫秒数,但基于版本的查询方式似乎存在一些差异:

Cassandra< = 2.1似乎不支持查询中的毫秒:yyyy-mm-dd' T' HH:mm:ssZ https://docs.datastax.com/en/cql/3.1/cql/cql_reference/timestamp_type_r.html

然而> = 3.0支持它:yyyy-mm-dd' T' HH:mm:ss.ffffffZ https://docs.datastax.com/en/cql/3.3/cql/cql_reference/timestamp_type_r.html

我已验证能够使用我在9160 Thrift端口上连接的IDE在较新的群集中进行选择/插入而不能在旧群集中进行选择/插入,尚未尝试使用cqlsh:

INSERT INTO "sp.status"("ams", "load_start_time")
    VALUES('RRG', '2018-05-01T16:57:18.123+0200')
;

-- same with select, works on new cluster but not old
SELECT * FROM sp.status WHERE ams = 'RRG' AND load_start_time='2018-05-01T16:57:18.123+0200'
;

驱动程序似乎能够映射java日期并在新旧集群中存储毫秒。

  

= Cassandra 2.1 cqlsh使用本机二进制协议(9042),以前的版本使用thrift(9160),尽管这不应该改变。