В драйвере UUIDs.unixTimestamp(UUID id)
есть служебный метод, который возвращает обычную метку времени эпохи, которую можно преобразовать в объект Date.
Стоит отметить, что точность ns от времени UUID не обязательно будет иметь смысл. uuid типа 1 включает отметку времени, которая представляет собой количество 100-наносекундных интервалов с момента первого принятия григорианского календаря в полночь 15 октября 1582 года по всемирному координированному времени. Но драйвер берет отметку времени в 1 мс (точность зависит от ОС на самом деле, может быть даже с точностью 10 или 40 мс) и поддерживает монотонный счетчик для заполнения оставшейся части 10000 неиспользованной точности, но может в конечном итоге считать в будущем, если в 1 мс есть более 10 тыс. значений (примечание: ограничения производительности в конечном итоге предотвратят это). Это гораздо более производительно и гарантирует отсутствие дубликатов, тем более что точность времени в компьютерах менее мс в распределенной системе довольно бессмысленна.
Так что, если вы смотрите исключительно с точки зрения CQL, нет способа сделать это без UDF, не то, чтобы в любом случае было много смысла выходить за пределы значения ms, поэтому dateOf должно быть достаточно. Хотя, если ты ДЕЙСТВИТЕЛЬНО этого хочешь
CREATE OR REPLACE FUNCTION uuidToNS (id timeuuid)
CALLED ON NULL INPUT RETURNS bigint
LANGUAGE java AS '
return id.timestamp();
';
Даст вам 100 нс от 15 октября 1582 года. Чтобы перевести это в наносекунды из epoc, умножьте его на 100, чтобы преобразовать в нано, и добавьте разницу со временем эпохи (-12219292800L * 1_000_000_000 в нано). Это может привести к переполнению длин, поэтому может потребоваться использовать что-то другое.
person
Chris Lohfink
schedule
19.02.2019