处理 Cassandra 时间戳

Dealing with Cassandra Timestamp

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

下面是我的示例 cassandra table 架构。

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

以下是我的问题:

1) 实际上我只需要日期(我不担心时间),在我的 table 模式中我使用了时间戳数据类型,是否有类似的数据类型仅存储日期而不是时间戳的日期。

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

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

当我尝试从代码中获取日期时,如果我的 table 中的记录是 2016-03-15 00:00:00+0000[=47=,那么假设它返回的日期少了一天],但从我的代码中它显示了类似 2016-03-14 EDT 的内容(由于时区问题,少了一天),如果它的时区问题我应该在我的 [= 中设置时区58=] 检索代码

4) 如果我想根据 empId 和 create_date 从我的 Java 代码中查询和获取记录如何制作像 [= Java 代码中的 15=],因为如果我只提供 where 条件下的日期,或者是否有更好的方法使用 Java 代码进行检索,它不会检索。

回到你的例子:

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

上面的语句将为 2016-03-15 00:00 UTC 创建一个时间戳值。

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

select 将匹配从给定日期 在您当地时区 创建的时间戳。这里要做的就是专门按照UTC查询,使用create_date='2016-03-15Z'

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