2009-11-03 79 views
2

我在嘗試按日期過濾一組objets時遇到了一些問題。現在,我可以得到全部 用戶的交易是這樣的:在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年10月我過濾它們P中ython只是爲了確認 ,這是正確的:

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

所以,是的,它們都具有正確的日期,但由於我的一些查詢的結果不匹配 預期的結果,什麼可能是任何想法查詢錯誤?

+0

也許client_email或者不是你認爲他們是APPLICATION_ID?或許你的意思是'<' and '> ='(如你在後面的代碼中)而不是'<=' and '>'(就像你在查詢中那樣)? – 2009-11-03 18:02:42

+0

@Jonathan:這兩個例子的順序都不一樣,但你可以看到那些日期應該仍然在這個範圍內。 WRT的屬性:你可以看到,只有通過application_id和client_email過濾返回4結果,而不是2,所以問題是在日期。 – 2009-11-03 19:37:40

+0

你是否在非工作示例中顯示了所有的gql?有什麼不同的細節嗎?有沒有排序? – 2009-11-03 20:16:28

回答

1

您是否試過使查詢日期信息符合App Engine GQL syntax? E.g語法:

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

除了使事情複雜化之外,這完全沒有區別。 – 2012-10-03 13:56:17

相關問題