You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 03:45:48