时间戳列上的Cassandra查询不返回Java';s即时型
我试图弄清楚如何使用Java8API在特定日期每隔一分钟查询cassandra 例如,假设我有一个组表时间戳列上的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
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');