2012-09-20 15 views
1

我在應用程序引擎上有一個應用程序,並且此應用程序有一個名爲Appointment的實體。約會有一個start_time和一個end_time。例如,我想根據時間提取約會,所以我希望獲得給定日期的所有約會。如何從應用程序引擎中的數據存儲中獲取基於時間的實體

由於應用引擎不支持基於兩個字段的不等式查詢,我該怎麼辦?

回答

2

您可以爲日期添加另一個字段。 ComputedProperty可能對此有意義。 或者你可以從一天的開始,批量獲取,一旦你到達一天結束時停止提取。我想你可以想出一個合理的默認值,根據你在一天中通常會有多少次約會來保持合理的效率。

+0

我正在做類似的事情。我將日期存儲爲參數,並將兩次存儲爲start_time和end_time。但是,這種方法存在一些問題。第一個想到的第一件事是,我不能支持午夜時段(從一天到另一天)。雖然有些方法可以解決這個問題,但至今我很滿意這個解決方案。 – Rafael

+0

請記住,「日期」並不直接與「時間」相關。格林威治標準時間上午1點總是凌晨1點(相同的長時間值),但根據用戶的時區,它可能是不同的日期。你說你的約會不能經過午夜,但總會有一個午夜。 –

+0

另外,還有夏令時等,不影響「時間」,但會影響「日期」。 –

0
"SELECT * FROM appointments WHERE start_time < {0} AND end_time > {0}".format(time_lookup) 

,或者如果AppEngine上不會讓你這樣做也許

Things.all().filter("end_time >", foo).filter("start_time <", foo) 

http://nick.zoic.org/art/python/multiple_inequalities/

Compare many date ranges in google app engine datastore (Many to many, Python)可以幫助

+0

第一個查詢不起作用,因爲應用程序引擎不允許它。第二個是壞的......如果我沒有弄錯,這將把數據庫中的所有東西帶到內存中,而我不想那麼做。 – Rafael

1

最大的問題是, 「日期」 是指不同的起始和結束「時間」取決於用戶的時區。而且你不能強迫所有的用戶堅持一個時區的所有生活,更不用說DST每年更換兩次。所以你不能簡單地在你的實體中創建一個新的屬性來按照建議存儲一個「日期」對象。 (這就是GAE沒有「日期」類型屬性的原因。)

我構建了一個調度應用程序。當用戶爲事件指定期望的範圍(可以是一天,一週或一個月)時,我檢索所有結束時間大於請求範圍的開始時間的事件,然後循環它們直到我找到開始時間小於範圍結束時間的最後一個事件。

根據請求的範圍(多於一個月而不是一天),您可以指定要在一個請求中提取多少個實體。例如,如果一個給定的日曆每天可能有5-10個事件,那麼獲取前10個實體就足夠了(如果條件不滿足,您總是可以獲取更多)。例如,對於一個月,您可以將批量大小設置爲100。然而,這是一個微型優化。

+0

我喜歡它......現在我不會使用它,因爲存儲日期選項對我來說工作正常,但我會保持這是對未來的關注。謝謝! – Rafael

相關問題