时间戳列上的Cassandra查询不返回Java';s即时型

时间戳列上的Cassandra查询不返回Java';s即时型,java,cassandra,datastax,Java,Cassandra,Datastax,我试图弄清楚如何使用Java8API在特定日期每隔一分钟查询cassandra 例如,假设我有一个组表 create table groups( group_name text, updated_on timestamp primary key (group_name, updated_on) ); 我在表中有以下记录 group_name updated_on RealGroup 2017-01-01 04:30:00-0800 RealGroup 2017-01-01

我试图弄清楚如何使用Java8API在特定日期每隔一分钟查询cassandra

例如,假设我有一个组表

create table groups(
group_name text,
updated_on timestamp
primary key (group_name, updated_on)
);
我在表中有以下记录

group_name    updated_on
RealGroup     2017-01-01 04:30:00-0800
RealGroup     2017-01-01 04:30:15-0800
MockGroup     2017-02-05 04:30:00-0800
我想执行一个对cassandra的查询,如下所示

select * from groups where group_name = 'RealGroup' and updated_on >= 2017 01-01 04:30:00-0800 AND <= 2017-01-01- 04:30:59-0800'

但是不返回任何值。

您正在对时间戳类型为
的列进行聚类。该类型表示

自标准基准时间(称为 纪元:1970年1月1日格林威治标准时间00:00:00

使用CQLSH时,可以使用表示该毫秒数的整数值

INSERT INTO groups (group_name , updated_on ) VALUES ( 'MockGroup', 1485221928341);
或者你可以使用

以下任何ISO 8601格式的字符串文字:

yyyy-mm-dd HH:mm  
yyyy-mm-dd HH:mm:ss  
yyyy-mm-dd HH:mmZ  
yyyy-mm-dd HH:mm:ssZ  
yyyy-mm-dd'T'HH:mm  
yyyy-mm-dd'T'HH:mmZ  
yyyy-mm-dd'T'HH:mm:ss  
yyyy-mm-dd'T'HH:mm:ssZ  
yyyy-mm-dd'T'HH:mm:ss.ffffffZ  
yyyy-mm-dd  
yyyy-mm-ddZ  
其中
Z
是RFC-822 4位时区,表示时区与UTC的差异

在您的示例中,您指定了

2017 01-01 04:30:00-0800
它包含一个比UTC晚8小时的时区。但是,当您用Java代码发出请求时,您创建了一个
即时
,表示UTC时区的4:30本地时间(即0偏移量)。那是什么

Instant start = startDate.toInstant(ZoneOffset.UTC);
是的。所以你只需要8个小时就可以得到数据库里的数据。相反,从当地时间4:30比UTC晚8小时的时区创建一个
即时

Instant start = startDate.toInstant(ZoneOffset.ofHours(-8));
Instant end = endDate.toInstant(ZoneOffset.ofHours(-8));
这会让你回到你想要的两组


有没有一种方法可以让我不必处理区域问题

是的,使用整数(如我的第一个示例)。普通数字比格式化字符串更难推理

或者,您可以在日期字符串的末尾使用
Z
来指示没有偏移UTC的祖鲁时区。比如说,

INSERT INTO groups (group_name , updated_on ) VALUES ( 'MockGroup', '2017-02-05 04:31:00Z');

显然,从Java代码来看,
Instant
没有时区的概念,它只是表示一个时间戳,就像Cassandra中的类型一样,因此您可以直接使用它

奇怪吗?出乎意料的是什么?返回值为空。您需要的不是
ZoneOffset.UTC
,而是一个
ZoneOffset
,它表示您在CQL查询中的
-0800
。是否有一种方法我不必处理区域?Datastax不支持DateTimeCodec。所以我只剩下实例了。要将datetime转换为实例,我必须传入偏移量,坦率地说,这些分区偏移量让我感到困惑。到底-0800是什么?格林威治时间?另外,我对您的回答感到困惑。当我使用datastax的驱动程序保存即时记录时,cassandra中的时间戳值似乎总是以人类易读的格式结束,即“2017-01-23 06:40:43-0800”,而不是以毫秒为单位的整数。您如何更改它?@user1172490这正是CQLSH显示它的方式。有两个技巧可以将其打印为整数。
Instant start = startDate.toInstant(ZoneOffset.UTC);
Instant start = startDate.toInstant(ZoneOffset.ofHours(-8));
Instant end = endDate.toInstant(ZoneOffset.ofHours(-8));
INSERT INTO groups (group_name , updated_on ) VALUES ( 'MockGroup', '2017-02-05 04:31:00Z');