在cqlsh的WHERE子句中如何将日期时间转换为timestamp?
解决Cassandra CQL中WHERE子句转换时间字符串为timestamp的问题
别担心,这个问题在Cassandra新手当中挺常见的,我来帮你梳理清楚解决方案!
首先,你遇到的报错Unable to coerce '2018-05-18 03:08:58.246000+0000' to formatted date (long),主要原因有两个:
- Cassandra的
timestamp类型只支持毫秒级精度(最多三位小数),而你的字符串里有六位微秒小数; - 你用的
空格分隔日期时间+时区的格式,CQLsh默认的解析器无法直接识别。
下面给你三种可行的解决方法:
方法1:使用标准ISO 8601格式字符串
Cassandra原生支持解析标准ISO 8601格式的时间字符串,只需要把你的时间格式调整为yyyy-MM-ddTHH:mm:ss.SSSZ的形式(用T分隔日期和时间,Z表示UTC时区),或者保留时区偏移+0000也可以。比如:
SELECT * FROM your_table WHERE created = '2018-05-18T03:08:58.246Z'; -- 或者带时区偏移的形式 SELECT * FROM your_table WHERE created = '2018-05-18T03:08:58.246+0000';
注意要把原来的六位小数截断为三位(毫秒级)。
方法2:使用toTimestamp()函数转换
如果你更习惯用原始的空格分隔格式,可以用Cassandra内置的toTimestamp()函数来转换字符串,同样要注意截断微秒到毫秒:
SELECT * FROM your_table WHERE created = toTimestamp('2018-05-18 03:08:58.246+0000');
这个函数会自动识别带时区的时间字符串,并转换为Cassandra能处理的timestamp类型。
方法3:直接使用时间戳数值
Cassandra的timestamp本质是毫秒级的Unix时间戳(从1970-01-01 UTC开始的毫秒数),你可以把目标时间转换成对应的数值,直接在WHERE子句中使用。比如你给出的时间对应的毫秒时间戳是1526610538246,查询语句如下:
SELECT * FROM your_table WHERE created = 1526610538246;
这种方式效率最高,但需要先把时间字符串转换为数值,适合批量查询或者脚本调用的场景。
额外提示
如果是范围查询(比如>、<、BETWEEN),以上方法同样适用,比如:
-- 查询2018-05-18之后创建的记录 SELECT * FROM your_table WHERE created > toTimestamp('2018-05-18 00:00:00+0000');
内容的提问来源于stack exchange,提问作者Victor A Chavez
相关产品推荐
相关产品推荐

