2009-11-03 3 views
2

У меня возникли проблемы с фильтрацией набора объектов по их дате. Сейчас я могу получить все сделки пользователя, как это:Фильтрация по датам в хранилище данных Google App Engine

> t = Transaction.all().filter("client_email =", "some_email").filter("application_id =", "foo").fetch(100) 
> len(t) 
# => 4 

Теперь, если я хочу установить некоторые даты фильтры:

> min = datetime.datetime(2009, 2, 3, 0, 0) 
> max = datetime.datetime(2009, 11, 4, 0, 0) 

> len(Transaction.gql("WHERE client_email =:1 AND date >:2 AND date <=:3 AND application_id =:4", 
         "some_email", min, max, "foo").fetch(100)) 
# => 2 

Я знаю, что все эти операции имеют дату < макс & &> мин:

> map(lambda x: x.date, t) 
# => [datetime.datetime(2009, 10, 2, 22, 43, 51), datetime.datetime(2009, 10, 5, 2, 5, 24), datetime.datetime(2009, 10, 7, 16, 51, 5), datetime.datetime(2009, 10, 7, 16, 6, 53)] 

Да, были сделаны все эти операции в октябре 2009 года я фильтруется их в P ython только подтвердить , что это было правильно:

> trans = filter(lambda x: x.date < max and x.date >= min, t) 
> len(trans) 
# => 4 

Так что да, все они имеют правильные даты, но из-за чего-то в моем запросе результаты не соответствуют ожидаемых результатов, ни малейшего представления о том, что может быть неправильно в запросе?

+0

Пожалуй client_email или APPLICATION_ID не то, что вы думаете, что они? Возможно, вы имеете в виду '<' and '> =' (как у вас в вашем более позднем коде), а не '<=' and '>' (как у вас есть в запросе)? –

+0

@ Джонатан: В обоих примерах порядок отличается от другого, но вы можете видеть, что эти даты все равно попадают в этот диапазон. WRT Свойства: вы можете видеть, что фильтрация только с помощью application_id и client_email возвращает 4 результата, а не 2, поэтому вопрос относится к датам. –

+0

Вы показываете все gql в нерабочем примере? Есть ли какая-то деталь, это совсем другое? Есть ли вид? –

ответ

1

Вы пытались сделать информацию о дате даты совместимой с App Engine GQL syntax?. Синтаксис например:

DATETIME(year, month, day, hour, minute, second) 
DATETIME('YYYY-MM-DD HH:MM:SS') 
DATE(year, month, day) 
DATE('YYYY-MM-DD') 
TIME(hour, minute, second) 
TIME('HH:MM:SS') 

Попробуйте выполнить следующее GQL:

"WHERE client_email =:1 AND date > DATE(:2) AND date <= DATE(:3) AND application_id =:4", "some_email", "2009-02-03", "2009-11-04", "foo" 
+0

Это не имеет никакого значения, кроме как усложнить ситуацию. –