处理 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 中也遇到与时区相关的问题,最简单的选择是简单地使用日期的字符串表示形式。
最近我开始研究 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 中也遇到与时区相关的问题,最简单的选择是简单地使用日期的字符串表示形式。