Кассандровская колонка с точностью до наносекунд - PullRequest
0 голосов
/ 19 февраля 2019

В таблице Кассандры есть timeuuid столбец типа данных, как узнать значение типа timeuuid в наносекундах?

timeuuid:

49cbda60-961b-11e8-9854-134d5b3f9cf8
49cbda60-961b-11e8-9854-134d5b3f9cf9

Как преобразовать этот timeuuid внаносекунды нуждаются в выражении выбора, например:

select Dateof(timeuuid) from the table a;

1 Ответ

0 голосов
/ 19 февраля 2019

В драйвере UUIDs.unixTimestamp(UUID id) есть служебный метод, который возвращает нормальную метку времени эпохи, которую можно преобразовать в объект Date.

Стоит отметить, что точность ns от времени UUID не обязательно будет иметь смысл.UUID типа 1 включает временную метку, которая представляет собой число интервалов в 100 наносекунд с момента, когда григорианский календарь был впервые принят в полночь 15 октября 1582 года UTC.Но драйвер берет отметку времени 1 мс (точность зависит от операционной системы, может быть даже точность 10 или 40 мс) и сохраняет монотонный счетчик, чтобы заполнить оставшуюся часть неиспользованной точности 10000, но может в конечном итоге считать в будущем, если в 1 мс естьболее 10 000 значений (примечание: ограничения производительности в конечном итоге предотвратят это).Это намного более производительно и гарантирует отсутствие дубликатов, особенно потому, что точность точного времени на компьютерах в распределенной системе довольно бессмысленна.

Так что, если вы смотрите с точки зрения чисто 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 в нано).Это может привести к переполнению longs, поэтому может потребоваться использовать что-то другое.

...