带有时区问题的Cassandra选择查询



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

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

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

我使用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"行。我不想在集群2中给出TZ,请告诉我如何做到这一点。

我必须承认,这有点奇怪,但在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时确实得到了结果,那么请确保您最初期望的数据是用期望的时区写入的。也许正因为如此,跨度中实际上没有任何数据,或者协调节点的时间戳不同。

最新更新