1

我们在两个不同的时区有两个不同的 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,请告知如何做到这一点。

4

1 回答 1

2

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

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

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

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

所以,我真诚的建议是指定时区,并指定相同的,大概是 GMT(或 UTC 时间)。免得自己头疼。请注意,GMT 并不完全等于 UTC,含义略有不同。这样,您应该忽略集群上的时区设置。时间戳最终存储为毫秒数(从某个点开始)。时区信息纯粹是“渲染”的东西。通过的毫秒数是相同的,例如2015/03/05 14:00:00+01002015/03/05 16:00:00+0300

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

于 2015-12-10T09:16:59.850 回答