Java 处理Cassandra时间戳
最近我开始研究cassandra,我遇到了一些使用cql和Java处理cassandra时间戳的问题 下面是我的cassandra表模式示例Java 处理Cassandra时间戳,java,cassandra,timestamp,cql,datastax,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)事实上,我只需要日期(我不担心时间),在我的表模式中,我使用了时间戳数据类型,是否有任何类似日期的数据
CREATE TABLE emp (
empid int,
create_date timestamp,
deptid int,
PRIMARY KEY (empid, create_date)
)
以下是我的问题:
1)事实上,我只需要日期(我不担心时间),在我的表模式中,我使用了时间戳数据类型,是否有任何类似日期的数据类型只存储日期而不是时间戳
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)如果我想根据empId从我的Java代码中查询并获取记录,并创建日期如何在Java代码中创建准确的模式,如
2016-03-15 00:00:00+0000
,因为如果我只在where条件中提供日期,那么它不是检索,或者使用Java代码检索是否有更好的方法。回到您的示例:
在emp(empId、deptId、create_date)中插入值(1,2,'2016-03-15 00:00:00+0000')
上述语句将为2016-03-15 00:00 UTC创建时间戳值
从emp中选择*,其中create_date='2016-03-15'和empid=1
select将与从本地时区中给定日期创建的时间戳匹配。您在这里要做的是使用create_date='2016-03-15Z'
专门按UTC进行查询
由于Java中也存在与时区相关的问题,因此最简单的选择是简单地使用日期的字符串表示 感谢@stefan podkowinski抽出时间,我有一些问题1)正如您建议的“只使用日期的字符串表示法”。这是否意味着我需要使用字符串datatime而不是表模式2中的时间戳2)正如您建议的使用“create_date='2016-03-15Z'查询”一样使用cqlsh可以很好地工作,但是如何使用java来实现这一点(我是如何通过使用joda datetime并将时区设置为UTC来获得正确的日期的)