处理Cassandra时间戳

时间:2016-03-23 18:32:11

标签: java cassandra timestamp cql datastax

最近我开始研究cassandra,我有一些使用cql和Java处理cassandra时间戳的问题。

以下是我的示例cassandra表架构。

CREATE TABLE emp (
    empid int,
    create_date timestamp,
    deptid int,
    PRIMARY KEY (empid, create_date)
)

以下是我的问题:

1)实际上我只需要日期(我不担心时间),在我的表模式中我使用了timestamp数据类型,是否有任何数据类型如date只存储日期而不是时间戳。< / p>

2)如果下面没有时间戳数据类型的替代方法,我是如何手动将记录插入表中的

Insert into emp(empId, deptId, create_date) values(1,2,'2016-03-15 00:00:00+0000');

当我尝试查询以使用cql检索记录时如下

select * from emp where create_date='2016-03-15' and empid=1;

它没有返回任何记录,因此我使用了以下查询

 select * from emp where create_date='2016-03-15 00:00:00+0000' and empid=1;

以上查询返回记录,那么如何查询以便我只需要获取日期记录。

3)我正在使用datastax 2.1 JAVA API与cassandra进行通信,下面是我的代码,我是如何从Java中检索时间戳列的。

row.getDate("create_date")

getDate方法返回java.util.date(更高版本返回 com.datastax.driver.core.LocalDate

当我尝试从代码中获取日期时,如果我的表中的记录为 2016-03-15 00:00:00 + 0000 ,那么假设它返回一天的时间更少,但是从我的代码中它显示了一些东西喜欢 2016-03-14 EDT (由于时区问题,这一天少了一天),如果我的时区问题应该在检索时在我的Java代码中设置时区

4)如果我想查询并从我的Java代码中获取基于empId和create_date的记录,如何在Java代码中创建类似2016-03-15 00:00:00+0000的精确模式,因为它不是检索我只在条件中提供日期,或者在使用Java代码检索时有更好的方法。

1 个答案:

答案 0 :(得分:4)

回到你的例子:

  

插入emp(empId,deptId,create_date)值(1,2,&#39; 2016-03-15 00:00:00 + 0000&#39;);

上述声明将为2016-03-15 00:00 UTC创建时间戳值。

  

从emp中选择*,其中create_date =&#39; 2016-03-15&#39;和empid = 1;

select将与您在本地时区中的给定日期创建的时间戳匹配。你在这里要做的是使用create_date='2016-03-15Z'专门用UTC查询。

由于您在Java中也遇到与时区相关的问题,最简单的选择是简单地使用日期的字符串表示。