2013-08-02 88 views
7

Như được hiển thị trong hình ảnh truy vấn với dấu thời gian chính xác (2013-08-01 15:02:56) không trả lại bất kỳ kết quả nào mặc dù một hàng có dấu thời gian đó tồn tại nhưng nó trả về kết quả với hàng đó khi được truy vấnSo sánh dấu thời gian trong cassandra

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

là hành vi bình thường này trong Cassandra? enter image description here

Trả lời

9

Có hành vi được mong đợi.

Theo the cassandra docs và tại đây here, cassandra lưu trữ dấu thời gian là "mili giây kể từ thời gian cơ bản chuẩn được gọi là kỷ nguyên".

Khi bạn chèn dữ liệu, bạn chèn một giá trị mili giây có độ chi tiết cao hơn "2013-08-01 15:02:56" (giá trị mili giây của "hiện tại" chỉ với giây và 0 mili giây). Toán tử EQ sẽ không bao giờ khớp với UNLESS dấu thời gian được chèn của bạn có 0 mili giây.

này sẽ làm việc

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

Vì vậy, khi bạn truy vấn nó thông qua cqlsh datetime của bạn được dịch sang một số nguyên (mili giây) đó chỉ là khác biệt so với giá trị mà bạn chèn ban đầu. Giá trị được chèn của bạn sẽ là một vài mili giây SAU "2013-08-01 15:02:56". Bạn truy vấn CHÍNH XÁC "2013-08-01 15:02:56" (và 0 mili giây). Sử dụng toán tử GT hoặc LT sẽ khớp, toán tử EQ sẽ không.

Hy vọng điều đó sẽ hữu ích!

+0

nhờ @ominbear trường đó là dấu thời gian không phải là TimeUUID. Tôi cũng đã thử truy vấn với múi giờ nhưng kết quả giống nhau. Có bất kỳ quy tắc nào theo hành vi cassandra như thế này không. Ngoài ra tôi chỉ tò mò, tại sao sử dụng dấu thời gian ở tất cả khi có TimeUUID? –

+0

hãy xem câu trả lời cập nhật – omnibear

11

Giống như omnibear nói rằng tôi nghĩ rằng vấn đề của bạn là dấu thời gian được lưu trữ bằng mili giây> 0.

Để thấy rằng việc tung ra truy vấn tiếp theo:

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

Sau đó kiểm tra những con số cuối cùng đó là những mili giây.

Nếu số cuối cùng> 0 (đó là những gì tôi mong đợi) thì điều này giải thích lý do tại sao bạn = xác nhận là sai.

Vì vậy, bạn có hai lựa chọn:

  1. Di mili giây khi bạn lưu trữ dữ liệu
  2. Query với phạm vi, một cái gì đó giống như ..

... cho tôi sự kiện sau 15:02 : 56 nhưng trước 15:02:57:

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

Câu trả lời của bạn xứng đáng nhận được nhiều tín dụng hơn vì đó là câu trả lời thực sự duy nhất tôi có thể tìm thấy sau khi dành nhiều thời gian tìm kiếm nó. –