Cassandra select 查询时区问题

Cassandra select query with timezone issue

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

在 cluster1 上,对于带有时间戳列的 select 查询,我不需要提及 tz[+0530] 值,而在另一个集群上,我必须并且应该在 select 中提供 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,请告知如何做。

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

(cqlsh) Fix timestamps before 1970 on Windows, always use UTC for timestamp display (CASSANDRA-10000)

另一方面,关于这个问题的文档非常清楚:

If no time zone is specified, the time zone of the Cassandra coordinator node handing the write request is used. For accuracy, DataStax recommends specifying the time zone rather than relying on the time zone configured on the Cassandra nodes.

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

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