最近我开始研究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代码检索时有更好的方法。
答案 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中也遇到与时区相关的问题,最简单的选择是简单地使用日期的字符串表示。