Cassandra 表有timeuuid
数据类型列,那么我如何timeuuid
以纳秒为单位查看类型的值?
时间:
49cbda60-961b-11e8-9854-134d5b3f9cf8
49cbda60-961b-11e8-9854-134d5b3f9cf9
如何将此 timeuuid 转换为纳秒需要一个 select 语句,例如:
select Dateof(timeuuid) from the table a;
驱动程序中有一个实用方法,UUIDs.unixTimestamp(UUID id)
它返回一个可以转换为 Date 对象的普通纪元时间戳。
值得注意的是,从 UUID 开始的 ns 精度不一定有意义。类型 1 uuid 包含一个时间戳,它是自 UTC 1582 年 10 月 15 日午夜首次采用公历以来的 100 纳秒间隔数。但是驱动程序需要一个 1 毫秒的时间戳(精度实际上取决于操作系统,甚至可以是 10 或 40 毫秒的精度)并保持一个单调计数器来填充剩余的 10000 个未使用的精度,但如果在 1 毫秒内有超过 10k 的值(注意:性能限制最终会阻止这种情况)。这更高效并且保证没有重复,尤其是在计算机中的亚毫秒时间精度在分布式系统中毫无意义。
因此,如果您从纯 CQL 的角度来看,没有 UDF 就无法做到这一点,并不是说无论如何超出 ms 值有很多价值,所以 dateOf 应该就足够了。如果你真的想要它
CREATE OR REPLACE FUNCTION uuidToNS (id timeuuid)
CALLED ON NULL INPUT RETURNS bigint
LANGUAGE java AS '
return id.timestamp();
';
将为您提供 1582 年 10 月 15 日起的 100ns。要将其转换为 epoc 的纳秒,请将其乘以 100 以转换为纳秒并添加与纪元时间的差(-12219292800L * 1_000_000_000 纳秒)。这可能会溢出多头,因此可能需要使用不同的东西。