2016-12-15 2 views
0

카산드라 2.28, 드라이브 3, 스파크 2를 사용합니다. Cassandra I n 에 시간 소인 열이 있는데이 날짜 부분에으로 질문하십시오. 날짜별로 쿼리하는 경우 : .where("TRAN_DATE= ?", "2012-01-21" : 결과가 없습니다. 시간 부분을 포함하면 잘못된 날짜가 표시됩니다. 내 데이터 (나는 cqlsh 읽을 수있는)입니다 : 2012-01-21 08 : 01 : 00 + 0000카산드라 쿼리 타임 스탬프 열

PARAM : "2012-01-21"> 오류 없음하지만 결과

PARAM은 " 2012-01-21 8시 1분 0초 ">오류 : 잘못된 날짜

PARAM"2012-01-21 08 : 01 : + 0000 00 ">오류 : 잘못된 날짜

SimpleDateFormat의 DATE_FORMAT = 새로운 SimpleDateFormat ("yyyy/mm/dd"); TRAN_DATE = DATE_FORMAT.parse ("1/19/2012"); 테이블에 테이블을

데이터를로드하기 위해 대량 로더/SSLoader을 사용해 본 적이 : 나는이 문제를 해결하려면 어떻게

tran_date    | id 
--------------------------+------- 
2012-01-14 08:01:00+0000 | ABC 
2012-01-24 08:01:00+0000 | ABC 
2012-01-23 08:01:00+0000 | ALM 
2012-01-29 08:01:00+0000 | ALM 
2012-01-13 08:01:00+0000 | ATC 
2012-01-15 08:01:00+0000 | ATI 
2012-01-18 08:01:00+0000 | FKT 
2012-01-05 08:01:00+0000 | NYC 
2012-01-11 08:01:00+0000 | JDU 
2012-01-04 08:01:00+0000 | LST 

합니다.

감사

답변

1

당신은 이와 같은 시간대를 제공하지 않고 타임 스탬프 열에 데이터를 삽입하는 경우 :

INSERT INTO timestamp_test (tran_date , id) VALUES ('2016-12-19','TMP') 
카산드라는 어떤 시간대가 지정되지 않은 경우 조정자 시간대

를 선택합니다

시간 쓰기 요청을 전달하는 Cassandra 코디네이터 노드의 영역이 사용됩니다. 정확성을 위해 DataStax는 Cassandra 노드에 구성된 시간대를 사용하지 않고 표준 시간대를 지정하도록 권장합니다.

당신이 Datastax 드라이버로 선택 실행하면

, 당신은 java.util.Date에 문자열 날짜를 변환 및 코디네이터 노드의 시간대를 설정해야합니다, 내 경우는
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
Date date = dateFormat.parse("2012-01-21"); 
dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+6")); //Change this time zone 
GMT + 6

했다

try (Cluster cluster = Cluster.builder().addContactPoints("127.0.0.1").withCredentials("username", "password").build(); Session session = cluster.connect("tests")) { 
    session.execute("INSERT INTO test_trans(tran_date , id) VALUES ('2016-12-19','TMP')"); 

    DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd"); 
    dateFormat.setTimeZone(TimeZone.getTimeZone("GMT+6")); 
    Date date = dateFormat.parse("2016-12-19"); 
    System.out.println(date); 
    for (Row row : session.execute(QueryBuilder.select().from("timestamp_test").where(QueryBuilder.eq("tran_date", date)))) { 
     System.out.println(row); 
    } 
} 
:

이제 당신은 여기

QueryBuilder.eq("TRAN_DATE", date) 

으로 조회 할 수있는 완전한 데모입니다 691,363,210

출처 : https://docs.datastax.com/en/cql/3.0/cql/cql_reference/timestamp_type_r.html

+0

감사합니다. 예, 날짜가 아닌 날짜를 사용해야합니다. 문자열 - 쿼리가 지금 실행됩니다 (오류 없음). 하지만 여전히 동일한 문제가 있습니다. ** 결과가 없습니다 **. 시간 문제를 해결해야합니다. –

+0

자세한 내용을 추가하십시오. –

+0

내 열은 'timestamp'이므로 테이블의 데이터는 날짜 - 시간입니다 (원래 데이터는 날짜 임에도 불구하고). 이제 날짜별로 쿼리를 시도 할 때 쿼리 만 실패합니다. 가능성이 일치하지 않습니다. 날짜 - 시간 - 오류가 쿼리를 시도했다. (원래 질문의 세부 사항). 그래서 내가 해결해야 할 문제는 날짜별로 질의하고 일치하는 것을 얻는 것입니다. 어떤 방법 으로든 쿼리 할 수는 있지만 두 옵션 모두 작동하지 않습니다. 그래서 어떻게 –

관련 문제