2013-08-02 7 views
7

Как показано на рисунке с точным меткой времени (2013-08-01 15:02:56), результат не возвращается, хотя строка с этой меткой времени существует, но она возвращает результаты с этой строкой при запросеСравнение временной отметки в cassandra

timestamps > '2013-08-01 15:02:56'

это нормальное поведение в Кассандре? enter image description here

ответ

9

Да, это ожидаемое поведение.

Согласно the cassandra docs и здесь here, cassandra хранит временные метки как «миллисекунды с момента стандартного базового времени, известного как эпоха».

Когда вы вставляете свои данные, вы добавляете значение миллисекунды с более высокой степенью детализации, чем ваше «2013-08-01 15:02:56» (миллисекундное значение «сейчас», всего за секунды и 0 миллисекунд). Оператор EQ никогда не будет соответствовать, ЕСЛИ ваша вставленная метка времени имеет 0 миллисекунд.

Это будет работать

SELECT * FROM myTable WHERE timestamps >= '2013-08-01 15:02:56' 
AND timestamps < '2013-08-01 15:02:57' 

Итак, когда вы запрашиваете его через cqlsh ваш DateTime переводится в целое число (в миллисекундах), который просто отличается от значения, вставленный первоначально. Ваше вставленное значение будет несколько миллисекунд ПОСЛЕ «2013-08-01 15:02:56». Вы запрашиваете ТОЧНО «2013-08-01 15:02:56» (и 0 миллисекунд). Использование оператора GT или LT будет соответствовать, оператор EQ не будет.

Надеюсь, что это поможет!

+0

благодарит @ominbear, что поле является меткой времени, а не TimeUUID. Я также попробовал запрос с часовыми поясами, но результаты были такими же. Существуют ли какие-либо правила, в соответствии с которыми такое поведение кассандры. Также мне просто интересно, зачем использовать временную метку вообще, когда есть TimeUUID? –

+0

взгляните на обновленный ответ. – omnibear

11

Как и всемогущий, я думаю, ваша проблема в том, что метка времени хранится с миллисекундами> 0.

Чтобы увидеть, запускающие следующий запрос:

select blobAsBigint(timestampAsBlob(timestamps)) where timestamps > '2013-08-01 15:02:56'; 

Затем проверьте последние номера, которые миллисекунды.

Если последние цифры> 0 (это то, что я ожидаю), то это объясняет, почему ваше утверждение = false.

Так у вас есть два варианта:

  1. удаление миллисекунды при сохранении данных
  2. запросов с диапазонами, что-то вроде ..

... дайте мне события после 15:02 : 56 но до 15:02:57:

where timestamps >= '2013-08-01 15:02:56' and timestamps < '2013-08-01 15:02:57' 
+1

. Ваш ответ заслуживает гораздо большего кредита, так как это единственный реальный ответ, который я смог найти, потратив много времени на его поиск. –