Cassandra 3.11.13中如何获取对应时区的时间戳数据?
解决Cassandra时区查询与CSV导出问题
一、正确查询指定时区的时间范围
Cassandra的timestamp类型本质存储的是UTC时间戳,直接使用带时区的字符串查询时,Cassandra会自动转换为UTC,但更直观可靠的方式是将存储时间转换为目标时区后再做比较:
方法1:使用时区偏移量
SELECT * FROM table_name WHERE primary_key = 'smth' AND timestamp AT TIME ZONE '+06:00' > '2022-10-14T06:30:00' AND timestamp AT TIME ZONE '+06:00' < '2022-10-14T23:59:59';
方法2:使用时区名称(推荐)
哈萨克斯坦标准时区为Asia/Almaty,用时区名称可避免夏令时变动影响:
SELECT * FROM table_name WHERE primary_key = 'smth' AND timestamp AT TIME ZONE 'Asia/Almaty' > '2022-10-14T06:30:00' AND timestamp AT TIME ZONE 'Asia/Almaty' < '2022-10-14T23:59:59';
如果手动转换UTC时间查询,需将GMT+6的时间转成UTC后编写条件:
- GMT+6的
2022-10-14T06:30:00对应UTC的2022-10-14T00:30:00 - GMT+6的
2022-10-14T23:59:59对应UTC的2022-10-15T03:59:59
查询语句如下:
SELECT * FROM table_name WHERE primary_key = 'smth' AND timestamp > '2022-10-14T00:30:00+0000' AND timestamp < '2022-10-15T03:59:59+0000';
二、导出CSV时获取GMT+6时区的时间
默认导出的timestamp列是UTC格式,需在查询中先转换为目标时区的时间再导出:
SELECT primary_key, -- 将UTC时间转换为Asia/Almaty时区的时间戳 timestamp AT TIME ZONE 'Asia/Almaty' AS local_timestamp, -- 其他需要导出的列 col1, col2 FROM table_name WHERE primary_key = 'smth' AND timestamp AT TIME ZONE 'Asia/Almaty' > '2022-10-14T06:30:00' AND timestamp AT TIME ZONE 'Asia/Almaty' < '2022-10-14T23:59:59';
执行上述查询后导出CSV,local_timestamp列将显示GMT+6时区的时间(如2022-10-14 07:51:00.000000+0600)。
内容的提问来源于stack exchange,提问作者Midas
相关产品推荐
相关产品推荐

