2017-01-24 4 views
1

java 8 apiを使用して特定の日付に1分間隔でcassandraをクエリする方法を理解しようとしています。JavaスタンドアロンタイプのCassandraクエリで値が返されない

たとえば、グループテーブルがあるとします。

create table groups(
group_name text, 
updated_on timestamp 
primary key (group_name, updated_on) 
); 

私はテーブル内の次のレコードを持っている

group_name updated_on 
RealGroup  2017-01-01 04:30:00-0800 
RealGroup  2017-01-01 04:30:15-0800 
MockGroup  2017-02-05 04:30:00-0800 

私は次のようなカサンドラにクエリを実行したいと思います。

select * from groups where group_name = 'RealGroup' and updated_on >= 2017 01-01 04:30:00-0800 AND <= 2017-01-01- 04:30:59-0800' 

本質的に、私はMINUTE間隔でデータを取得したいと思います。

私はdatastax apiでGroupAccessorを使用しています。

@Query("SELECT * FROM GROUPS WHERE GROUP_NAME = :groupName AND UPDATED_ON>= :startDate AND UPDATED_ON<= :endDate") 
Result<Group> getResults(@Param("groupName") String groupName, @Param("startDate") Instant startDate, @Param("endDate") Instant endDate); 

私の質問は、クライアントの呼び出しはどうですか?どのようなJava 8のAPIを使用してリクエストを送信する正しい方法は?

私は以下を使用していますが、それは私に奇妙な結果を与えています。

LocalDateTime startDate = LocalDateTime.of(2017, Month.JANUARY, 1, 4, 30); 
LocalDateTime endDate = LocalDateTime.of(2017, Month.JANUARY, 1, 4, 31); 
Instant start = startDate.toInstant(ZoneOffset.UTC); 
Instant end = endDate.toInstant(ZoneOffset.UTC); 

Result<Group> dateGroup = groupAccessor.getResults("RealGroup", start, end); 

実際には、このコードは2行を返す必要があります。

RealGroup  2017-01-01 04:30:00-0800 
RealGroup  2017-01-01 04:30:15-0800 

ただし、返さない。

+0

_Odd_ how?予期しないことは何ですか? –

+0

返品は空です。 – user1172490

+0

'ZoneOffset.UTC'の代わりに、CQLクエリにある' -0800'を表す 'ZoneOffset'が必要です。 –

答えて

2

タイプtimestampの列にクラスタリングしています。 timestampタイプは

に エポックとして知られている標準ベースの時間からのミリ秒数を表す:00:00:00 GMTで1970年1月1日を

CQLSHを使用している場合、あなたは整数を使用することができますミリ秒

INSERT INTO groups (group_name , updated_on) VALUES ('MockGroup', 1485221928341); 

またはその数を表す値を使用でき

以下のISO 8601本のいずれかの形式で文字列リテラル:Zはあなたの例ではUTC

からのタイムゾーンの違いを表現する、RFC-822の4桁タイムゾーンである

yyyy-mm-dd HH:mm 
yyyy-mm-dd HH:mm:ss 
yyyy-mm-dd HH:mmZ 
yyyy-mm-dd HH:mm:ssZ 
yyyy-mm-dd'T'HH:mm 
yyyy-mm-dd'T'HH:mmZ 
yyyy-mm-dd'T'HH:mm:ss 
yyyy-mm-dd'T'HH:mm:ssZ 
yyyy-mm-dd'T'HH:mm:ss.ffffffZ 
yyyy-mm-dd 
yyyy-mm-ddZ 

指定した

2017 01-01 04:30:00-0800 

には、UTCの8時間遅れのタイムゾーンが含まれています。しかし、Javaコードでリクエストしたときは、UTCのタイムゾーン(つまりオフセット0)から現地時間4:30を表すことを意味するInstantを作成しました。それは何ですか

Instant start = startDate.toInstant(ZoneOffset.UTC); 

です。つまり、データベースに実際に入っている時間は8時間です。代わりに、現地時間4:30にUTCから8時間遅れている時間帯からInstantを作成します。

Instant start = startDate.toInstant(ZoneOffset.ofHours(-8)); 
Instant end = endDate.toInstant(ZoneOffset.ofHours(-8)); 

これで、必要な2つのグループを元に戻すことができます。

ゾーンを処理する必要はありませんか?

はい、私の最初の例のような整数を使用してください。書式設定された文字列よりも単純な数値について考えるのは難しいです。

または、日付文字列の末尾にZを使用すると、オフセットUTCを持たないズールー時間帯を示すことができます。例えば、

INSERT INTO groups (group_name , updated_on) VALUES ('MockGroup', '2017-02-05 04:31:00Z'); 

もちろん、Javaコードから、Instantは、それは単純にカサンドラではタイプのように、タイムスタンプを表し、あなたはそれを直接使用することができ、タイムゾーンの概念がありません。

+0

datastaxのドライバでインスタントレコードを保存すると、cassandraのタイムスタンプの値は、ミリ秒単位の整数ではなく、人間が読みやすい形式、つまり '2017-01-23 06:40:43-0800'になります。あなたはどうやってそれを変えますか? – user1172490

+0

@ user1172490これはCQLSHが表示する方法です。 [Here](http://stackoverflow.com/questions/28547616/cassandra-cqlsh-how-to-show-microseconds-milliseconds-for-timestamp-columns)は整数として印刷するためのいくつかのトリックです。 –

関連する問題