2016-03-23 2 views
3

Недавно я начал работать над cassandra, и у меня есть некоторые проблемы, связанные с timestamp cassandra с использованием cql и Java.Работа с Cassandra Timestamp

Ниже приведена схема таблицы образцов кассандры.

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

Вот мои вопросы ниже:

1) На самом деле мне нужна только дата (я не беспокоюсь о время), В моей таблице схеме я использовал временную метку типа данных, Есть ли тип данных, как дата, чтобы сохранить только дату, а не метку времени.

2) Если нет альтернативы временной метки типа данных ниже, как я вставить запись в таблицу вручную

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

Когда я пытаюсь возвращающий записи с помощью CQL ниже

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

Это не возвращает запись так что я должен использовать ниже запрос

select * from emp where create_date='2016-03-15 00:00:00+0000' and empid=1; 

выше возвращаемая запись запроса, Так как запросить, чтобы мне нужно было получать записи только с датой.

3) Я использую datastax 2.1 JAVA API для связи с cassandra. Ниже приведен мой код, как я извлекаю столбцы timestamp из Java.

row.getDate("create_date") 

метод GetDate возвращается java.util.Date (более поздние версии возвращающегося com.datastax.driver.core.LocalDate)

Когда я пытаюсь получить дату из кода его возвращение один день меньше, предположим, что если запись в моей таблице 2016-03-15 00: 00: 00 + 0000, но из моего кода она показывает что-то вроде 2016-03-14 EDT (на один день меньше это из-за проблемы с часовым поясом), If его вопрос в часовом поясе должен установить часовой пояс в моем Java-коде при извлечении

4) Если я хочу запросить и получить запись из кода Java на основе empId и create_date, как сделать точный шаблон, например 2016-03-15 00:00:00+0000 в Java-коде, поскольку он не извлекает, любой лучший способ получить с помощью Java-кода.

ответ

3

Возвращаясь к вашему примеру:

Вставить в эй (EmpId, deptId, create_date) значение (1,2, '2016-03-15 00: 00: 00 + 0000');

Вышеприведенное заявление создаст отметку времени для 2016-03-15 00:00 UTC.

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

Выбрать, будет соответствовать против метки времени, созданной с указанной даты в вашем часовом поясе. Что вам нужно сделать, так это конкретно запросить UTC, используя create_date='2016-03-15Z'.

Поскольку у вас также есть проблемы, связанные с часовым поясом в Java, самым простым вариантом было бы просто использовать строковое представление даты.

+0

Спасибо @stefan podkowinski за ваше время, у меня есть некоторые вопросы 1) Как вы предложили «просто использовать строковое представление даты.» это значит, что нужно использовать строку datatime вместо временной метки в таблице схемы 2) Как вы предположили, запрашивая с помощью «create_date =" 2016-03-15Z»работает отлично, используя cqlsh, но как это сделать с помощью java (некоторые из того, как мне удалось получить правильную дату, используя дату и время joda, и часовой пояс настройки в формате UTC) –

Смежные вопросы