2016-03-23 17 views
3

最近、私はcassandraの作業を開始しました。そして、cqlとJavaを使ってcassandraタイムスタンプを扱ういくつかの問題があります。Cassandraタイムスタンプを扱う

以下は私のサンプルのcassandraテーブルのスキーマです。ここで

CREATE TABLE emp (
    empid int, 
    create_date timestamp, 
    deptid int, 
    PRIMARY KEY (empid, create_date) 
) 

以下の私の質問されています

1)は実際に私が(私は時間が心配ないです)日付のみを必要とする、私は、タイムスタンプのデータ型を使用していた私のテーブルスキーマでは、のような任意のデータ型があります日付の代わりにタイムスタンプのみを格納する日付。

2)以下のtimestampデータ型への代替が存在しない場合は、手動で、私はテーブルにレコードを挿入しています方法です

Insert into emp(empId, deptId, create_date) values(1,2,'2016-03-15 00:00:00+0000'); 

私は

select * from emp where create_date='2016-03-15' and empid=1; 
以下のようにCQLを使用してレコードを取得するために照会しようとしています場合には

私は、クエリ

select * from emp where create_date='2016-03-15 00:00:00+0000' and empid=1; 
の下に使用しているので、それは任意のレコードを返さないです

上記のクエリはレコードを返しました。したがって、レコードのみを取得する必要があるようにクエリをどのように行うか。

3)私はcassandraと通信するためにdatastax 2.1 Java APIを使用しています。以下は、Javaからタイムスタンプ列を取得する方法です。

row.getDate("create_date") 

私はコードからその戻って1日少ないものと想定日付を取得しようとするとgetDateメソッドはjava.util.date(それ以降のバージョンがcom.datastax.driver.core.LocalDateを返す)

を返します私のテーブルのレコードが2016-03-15 00:00:00 + 0000の場合、私のコードからは2016-03-14 EDTのようなものが表示されます。そのタイムゾーンの問題は、取得中にJavaコードでタイムゾーンを設定する必要があります

4) empIdとcreate_dateに基づいてJavaコードからレコードを取得したい場合は、Javaコードで2016-03-15 00:00:00+0000のような正確なパターンを作成するには、どこの条件で日付のみを提供するのか検索しないJavaコードを使用して検索する場合は、より良い方法です。

答えて

3

戻ってあなたの例に行き方:

EMPに挿入(EMPID、DEPTID、CREATE_DATE)の値(1,2、 '2016年3月15日00:00:00 + 0000');

上記のステートメントは、2016-03-15 00:00 UTCのタイムスタンプ値を作成します。

select * from emp create_date = '2016-03-15'とempid = 1;

選択は、ローカルタイムゾーンの指定された日付から作成されたタイムスタンプと一致します。あなたがここでしなければならないことは、create_date='2016-03-15Z'を使ってUTCによって具体的に問い合わせることです。

Javaでタイムゾーンに関連する問題もあるので、最も簡単な選択肢は、単に日付の文字列表現を使用することです。

+0

あなたが示唆したように、あなたの時間のためのpodkowinski @stefanおかげで、私はいくつかの質問 1)を持っている「だけで、日付の文字列表現を使用しています。」それは私がテーブルスキーマにタイムスタンプの代わりに、文字列datatimeを使用する必要がどういう意味 2)あなたが使用して照会することが示唆されているように、「CREATE_DATE = 『2016-03-15Z』を」どのように使用してこれを行うにはcqlshを使用して完璧に働いているが、 java(joda datetimeを使って正しい日付を取得し、UTCとしてタイムゾーンを設定する方法) –