2016-12-15 323 views
0

使用Cassandra 2.28,Drive 3,Sparks2。 我在Cassandra中有一个时间戳列,我在的日期部分只查询。如果我按日期查询:.where("TRAN_DATE= ?", "2012-01-21":它不会带来任何结果。如果我包含时间部分,则表示无效日期。我的数据(如我可以cqlsh阅读)是:2012-01-21 08:01:00 + 0000Cassandra查询时间戳列

PARAM: “2012-01-21”>没有错误,但没有结果

PARAM:“ 2012-01-21 8点01分00" 秒>错误:无效日期

PARAM: “2012-01-21 08:01:00 + 0000”>错误:无效日期

的SimpleDateFormat DATE_FORMAT =新的SimpleDateFormat(“yyyy/mm/dd”); TRAN_DATE = DATE_FORMAT.parse(“1/19/2012”); 曾用批量载入/ SSLoader装载表

数据表:

tran_date    | id 
--------------------------+------- 
2012-01-14 08:01:00+0000 | ABC 
2012-01-24 08:01:00+0000 | ABC 
2012-01-23 08:01:00+0000 | ALM 
2012-01-29 08:01:00+0000 | ALM 
2012-01-13 08:01:00+0000 | ATC 
2012-01-15 08:01:00+0000 | ATI 
2012-01-18 08:01:00+0000 | FKT 
2012-01-05 08:01:00+0000 | NYC 
2012-01-11 08:01:00+0000 | JDU 
2012-01-04 08:01:00+0000 | LST 

我该如何解决这个问题。

感谢

回答

1

如果你将数据插入timestamp列没有这样一个提供时区:

INSERT INTO timestamp_test (tran_date , id) VALUES ('2016-12-19','TMP') 

卡桑德拉会选择协调员时区

如果没有指定时区,时间使用处理写入请求的Cassandra协调器节点的区域。为了准确,DataStax建议指定时区而不是依赖Cassandra节点上配置的时区。

如果执行select与Datastax驱动程序,你需要转换字符串日期为java.util.Date和设置协调器节点的时间段,对我来说,这是GMT + 6

DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
Date date = dateFormat.parse("2012-01-21"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+6")); //Change this time zone 

现在你可以用

QueryBuilder.eq("TRAN_DATE", date) 

这里查询是一个完整的演示:

try (Cluster cluster = Cluster.builder().addContactPoints("127.0.0.1").withCredentials("username", "password").build(); Session session = cluster.connect("tests")) { 
    session.execute("INSERT INTO test_trans(tran_date , id) VALUES ('2016-12-19','TMP')"); 

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+6")); 
    Date date = dateFormat.parse("2016-12-19"); 
    System.out.println(date); 
    for (Row row : session.execute(QueryBuilder.select().from("timestamp_test").where(QueryBuilder.eq("tran_date", date)))) { 
     System.out.println(row); 
    } 
} 

来源:https://docs.datastax.com/en/cql/3.0/cql/cql_reference/timestamp_type_r.html

+0

谢谢。是的,我需要使用日期而不是日期字符串 - 查询现在运行(没有错误)。但我仍然有同样的问题 - **没有结果**。需要解决时间问题。 –

+0

添加更多详情 –

+0

我的专栏是'timestamp',所以我的表中的数据是日期 - 时间(即使原始数据仅为日期)。现在,当我尝试按日期查询时,只有查询失败 - 可能不匹配。我试着用日期时间查询 - 出错了。 (原始问题中的细节)。所以我需要解决的问题是按日期查询并获得匹配。我可以查询任何方式 - 尝试2个选项都不起作用。那么如何 –