【问题标题】:Cassandra select query with timezone issue带有时区问题的 Cassandra 选择查询
【发布时间】:2016-03-15 17:53:36
【问题描述】:

我们在两个不同的时区有两个不同的 cassandra 集群。

  • Cluster1:2.1.8 版本,带 IST TZ
  • Cluster2:2.1.9 版本,带 UTC TZ

在 cluster1 上,对于带有时间戳列的选择查询,我不需要提及 tz[+0530] 值,而在另一个集群上,我必须并且应该在选择查询中提供 TZ 值来获取行。它与cassandra版本有关吗?

我使用 cqlsh 来做查询部分。我尝试了 cqlshrc 文件选项,它只会改变输出的格式。

集群1:

select * from test.check where row_timestamp = '1970-01-01 00:00:00';

集群2:

select * from test.check where row_timestamp = '1970-01-01 00:00:00+0000';

如果没有提到 TZ,我得到“0”行。 我不想在 cluster2 中给 TZ,请告知如何做到这一点。

【问题讨论】:

    标签: cassandra cassandra-2.0 cqlsh spark-cassandra-connector cassandra-2.1


    【解决方案1】:

    这有点奇怪,我必须承认,但 2.1.8 和 2.1.9 之间的时区操作可能会有一些变化。这是来自变更日志:

    (cqlsh) 在 Windows 上修复 1970 年之前的时间戳,始终使用 UTC 时间戳显示(CASSANDRA-10000)

    另一方面,文档在这个问题上非常清楚:

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

    所以,我真诚的建议是指定时区,并指定相同的,大概是 GMT(或 UTC 时间)。免得自己头疼。 Mind, GMT is not exactly equal to UTC, there is a slight difference in meaning。这样,您应该忽略集群上的时区设置。时间戳最终存储为毫秒数(从某个点开始)。时区信息纯粹是“渲染”的东西。传递的毫秒数相同,例如2015/03/05 14:00:00+0100 和2015/03/05 16:00:00+0300。

    如果您没有指定任何内容并获得 0 个结果,而您在使用 +0000 时确实获得了结果,那么请确保您最初预期的数据是使用预期的时区写入的。可能因为这个原因,span中实际上没有任何数据,或者协调节点时间戳不同。

    【讨论】:

    • 谢谢,原来是版本变了。
    猜你喜欢
    • 2016-10-20
    • 1970-01-01
    • 1970-01-01
    • 2015-05-22
    • 2017-03-12
    • 2020-01-06
    • 2013-12-27
    • 2019-09-28
    • 2016-08-28
    相关资源
    最近更新 更多