【问题标题】:Dealing with Cassandra Timestamp处理 Cassandra 时间戳
【发布时间】:2016-07-11 05:04:42
【问题描述】:

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

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

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 和 create_date 从我的 Java 代码中查询和获取记录,如何在 Java 代码中制作像 2016-03-15 00:00:00+0000 这样的精确模式,因为如果我提供它不会检索仅日期在 where 条件下,或者有没有更好的方法来检索使用 Java 代码。

【问题讨论】:

    标签: java cassandra timestamp cql datastax


    【解决方案1】:

    回到你的例子:

    插入 emp(empId, deptId, create_date) 值(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;

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

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

    【讨论】:

    • 感谢@stefan podkowinski 抽出宝贵时间,我有一些问题 1) 正如您所建议的那样“只需使用日期的字符串表示。”这是否意味着我需要在表模式 2 中使用字符串数据时间而不是时间戳记)正如您所建议的使用“create_date='2016-03-15Z'”进行查询时使用 cqlsh 可以完美地工作,但是如何使用 java 来做到这一点(我是如何做到的)已设法通过使用 joda datetime 并将时区设置为 UTC 来获得正确的日期)
    猜你喜欢
    • 2015-03-28
    • 1970-01-01
    • 2020-05-11
    • 1970-01-01
    • 2017-04-02
    • 1970-01-01
    • 2010-12-30
    • 2021-01-17
    • 2017-03-06
    相关资源
    最近更新 更多