无法强制转换为格式化日期-Cassandra时间戳类型

时间:2018-10-27 12:39:01

标签: cassandra cql cassandra-3.0 cqlsh spring-data-cassandra

我在cassandra表中存储了时间戳类型列的值,格式为 2018-10-27 11:36:37.950000 + 0000(GMT日期)。 当我在查询下运行以获取数据时,我无法将'2018-10-27 11:36:37.950000 + 0000'强制转换为格式化日期(长)

select create_date from test_table where create_date='2018-10-27 11:36:37.950000+0000' allow filtering;

如果数据已存储在表中(格式为2018-10-27 11:36:37.950000 + 0000),并且还对执行范围(> =或<=)操作,如何使查询正常工作> create_date 列?

我尝试过create_date='2018-10-27 11:36:37.95Z', create_date='2018-10-27 11:36:37.95' create_date='2018-10-27 11:36:37.95'也是如此。

是否可以对这种时间戳类型的数据执行过滤?

P.S。使用cqlsh在cassandra表上运行查询。

2 个答案:

答案 0 :(得分:1)

在第一种情况下,问题在于您以毫秒为单位指定时间戳,而Cassandra以毫秒为单位-尝试删除最后三个数字-.950而不是.950000(请参阅此{{3} })。时间戳记以64位数字的形式存储在Cassandra中,然后在打印结果时使用datetimeformat的{​​{1}}选项指定的格式进行格式化(请参阅document)。没有明确时区的日期将要求在cqlshrc中指定默认时区。

关于过滤数据的问题-该查询仅适用于少量数据,而对于较大的数据,此查询很可能会超时,因为它将需要扫描集群中的所有数据。另外,数据将无法正确排序,因为排序仅发生在单个分区内。

如果您想执行此类查询,则Spark Cassandra Connector可能是更好的选择,因为它可以有效地选择所需的数据,然后可以执行排序等。尽管这将需要更多的资源。

我建议从DataStax学院学习doc课程,以了解如何为Cassandra建模数据。

答案 1 :(得分:0)

这对我有用

var datetime = DateTime.UtcNow.ToString("yyyy-MM-dd HH:MM:ss");
                var query = $"SET  updatedat = '{datetime}' WHERE ...