如何用SELECT语句将Cassandra的timeuuid类型值转换为纳秒精度?
如何在Cassandra中查看TimeUUID的纳秒精度表示
咱们先明确一点:Cassandra自带的dateOf()或者toTimestamp()函数只能给到毫秒级的时间精度,要是想拿到纳秒级的,得靠TimeUUID本身的结构来算——毕竟咱们用的版本1的TimeUUID(也就是Cassandra里的timeuuid类型),前64位其实藏着以100纳秒为单位的时间戳,只不过这个时间的起点是1582年10月15日,不是咱们熟悉的Unix纪元(1970-01-01)。
针对你的需求,我给你写个直接能用的SELECT语句,既能看到原始的TimeUUID值,也能得到从Unix纪元开始的纳秒级时间戳,还可以加个毫秒级时间做参考:
SELECT your_timeuuid_column, -- 替换成你的timeuuid列名 -- 计算从Unix纪元开始的纳秒数 (blobAsBigint(blobof(your_timeuuid_column)) - 122192928000000000) * 100 AS nanoseconds_since_epoch, -- 毫秒级时间戳(参考用) toTimestamp(your_timeuuid_column) AS timestamp_milliseconds FROM your_table_name; -- 替换成你的表名
给你拆解一下这个语句里的关键点:
blobof(your_timeuuid_column):把TimeUUID转换成二进制格式的blob,这样才能提取里面的时间部分blobAsBigint(...):把二进制blob转成BigInt类型,拿到TimeUUID里时间部分的原始数值(这个数值是以100纳秒为单位,从1582年10月15日开始计数的)122192928000000000:这个是Unix纪元到1582年10月15日的时间差,转换成100纳秒单位的数值,减去它之后,就得到了从Unix纪元开始的100纳秒计数- 最后乘以100,就把单位转换成了纳秒,得到咱们要的纳秒精度时间戳
另外,针对你给出的两个TimeUUID值:49cbda60-961b-11e8-9854-134d5b3f9cf8和49cbda60-961b-11e8-9854-134d5b3f9cf9,它们的差异其实在节点ID部分,时间部分是完全相同的,所以计算出来的纳秒时间戳也会一模一样。如果两个TimeUUID的时间部分有差异,你就能看到纳秒级的时间差了。
要是你只是想看看TimeUUID原始的时间计数(不转换到Unix纪元),可以用这个简化版的查询:
SELECT your_timeuuid_column, blobAsBigint(blobof(your_timeuuid_column)) AS time_100ns_since_1582 FROM your_table_name;
内容的提问来源于stack exchange,提问作者Shailaja Koppishetty
相关产品推荐
相关产品推荐

