当前位置: 首页 > 知识库问答 >
问题:

Cassandra查询时间戳列

昝欣可
2023-03-14

使用Cassandra 2.28,Drive 3,Sparks2。我在Cassandra中有一个timestamp列,我只需要按日期部分查询它。如果我按日期查询:<代码>。其中(“交易日期=?”,“2012-01-21”:它不会带来任何结果。如果我包括时间部分,它会显示无效日期。我的数据(如我在cqlsh中所读)是:2012-01-21 08:01:00 0000

参数:“2012-01-21”

参数:"2012-01-21 08:01:00"

参数:“2012-01-21 08:01:00 0000”

SimpleDataFormat DATE\u格式=新的SimpleDataFormat(“YY/mm/dd”);TRAN\u DATE=日期格式。parse(“2012年1月19日”);已使用批量加载器/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个答案

傅浩漫
2023-03-14

如果您将数据插入时间戳列而不提供像这样的时区:

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

Cassandra会选择协调器时区

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

如果使用Datastax驱动程序执行select,则需要将字符串日期转换为java。util。日期并设置协调器节点的时区,在我的示例中是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

 类似资料:
  • 我想查询cassandra timestamp列,例如this hour、last hour、beather。 我在mysql中执行了与昨天数据相同的查询

  • 从mytable中选择*,其中id='5'和postingdate>='2018-11-06 00:00:00'和postingdate<='2018-11-06 23:59:59'; 在开发中心控制台(或CQLSH)上运行这个查询,会给我相同的结果,而不考虑时区。我在PST和IST中都尝试过,得到了同样的结果。在执行查询之前,Cassandra是在执行PST->UTC还是IST->UTC转换?如

  • 我需要使用Cassandra查询将时间戳“1998/02/12 00:00:00”转换为数据1998-02-12。谁能帮我一下吗。有没有可能?

  • null 还是有其他(更好的)选择? 谢谢

  • 我有带有时间戳(UTC时间)的json日志。我将键和值映射到Cassandra表键并插入记录。但是,Cassandra通过从时间戳中减去5小时,再次将已有的UTC时间戳转换为UTC。这里的时区是(GMT+5)。 现在时间已经是UTC时间,并且仍然插入5小时前的时间戳。 我如何解决这个问题?

  • 我想知道是否有办法查询这个。在下面的例子中,我有一个出席日期列表。正如你所看到的,2-11在2-2之前被添加到Firebase。 我在做一个电话:firebase。 有了以上这些,我总能在firebase数据库中创建最后一条记录。然而这让我很失望,因为2-11已经不是最后一场了。有没有这样的方法: 显然以上行不通。只有一个例子。有什么想法吗?